Persisting Data To SQL Server via ASP.NET MVC - sql-server

I am trying to persist the information in the 'auction' variable, to the table 'Auction', which has not been created yet. Entity framework is supposed to create it for me I understand. As you see, my program has made it to the point where the form data is contained in the 'auction' variable. But as you can see the debugger is stopped on 'db.Auction.Add(auction)'.
Why won't the program proceed by letting the db add the data in the 'auction' variable, to the Auction table?
I'd appreciate it.
Thanks,
CM
Thank you for replying so far but the suggestions are not working. I've written in my code as well as shown the error message again which is the same message I had that started this thread.
The View
#model MvcAuction.Models.Auction
#{
ViewBag.Title = "CreateAuctionItem";
}
<h2>#ViewBag.Title.</h2>
<div id="createAuctionItemSection">
#using (Html.BeginForm("Create", "Auctions", FormMethod.Post,
new { #class = "form-horizontal", #id =
"registerForm", role = "form" }))
{
#Html.AntiForgeryToken()
<h4>Create An Item For Auction.</h4>
<hr />
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.Title, new { #class = "col-md-2 control-
label" })
<div class="col-md-10">
#Html.TextBoxFor(m => m.Title, new { #class = "form-control", #id = "title" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.StartDate, new { #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.TextBoxFor(model => model.StartDate, "{0:yyyy-MM-dd}", new { type = "date" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.EndDate, new { #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.TextBoxFor(model => model.EndDate, "{0:yyyy-MM-dd}", new { type = "date" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.DeliveryCost, new { #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.TextBoxFor(m => m.DeliveryCost, new { #class = "form-control", #id = "deliveryCost" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.StartBid, new { #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.TextBoxFor(m => m.StartBid, new { #class = "form-control", #id = "startBid" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.BuyNowPrice, new { #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.TextBoxFor(m => m.BuyNowPrice, new { #class = "form-control", #id = "buyNowPrice" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.BuyNowEnabled, new { #Value = "Show Buy Now Price?", #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.CheckBoxFor(m => m.BuyNowEnabled, new { #class = "form-control", #id = "buyNowEnabled" })
</div>
</div>
#Html.ValidationSummary("", new { #class = "text-danger" })
<div class="form-group">
#Html.LabelFor(m => m.Description, new { #class = "col-md-2 control-label" })
<div class="col-md-10">
#Html.TextBoxFor(m => m.Description, new { #class = "form-control", #id = "description" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Create Item" />
</div>
</div>
}
<img src="~/Content/Images/progress.gif" id="progress" style="display:none;" />
<h3>#ViewBag.TheMessage</h3>
</div><!--End createAuctionItemSection-->
The Model
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace MvcAuction.Models
{
public class Auction
{
public long Id { get; set; }
[Required]
[Column(TypeName = "varchar")]
[Display(Name = "Title")]
public String Title { get; set; }
public string ImageURL { get; set; }
[Required]
[Column(TypeName = "date")]
[Display(Name = "Start Date")]
public DateTime StartDate { get; set; }
[Required]
[Column(TypeName = "date")]
[Display(Name = "End Date")]
public DateTime EndDate { get; set; }
[Required]
[Column(TypeName = "decimal")]
[Display(Name = "Delivery Cost")]
public decimal DeliveryCost { get; set; }
[Required]
[Column(TypeName = "decimal")]
[Display(Name = "Start Bid")]
public decimal StartBid { get; set; }
[Column(TypeName = "decimal")]
[Display(Name = "Buy Now Price")]
public decimal BuyNowPrice { get; set; }
[Column(TypeName = "bool")]
[Display(Name = "Buy Now Enabled")]
public Boolean BuyNowEnabled { get; set; }
[Column(TypeName = "varchar")]
[Display(Name = "Description")]
public String Description { get; set; }
[Column(TypeName = "int")]
[Display(Name = "View Count")]
public int ViewCount = 0;
public decimal? getCurrentTopBid()
{
return StartBid;
}
}
}
The Controller Action
[HttpPost]
public ActionResult Create(Auction auction )
{
if (ModelState.IsValid)
{
var db = new AuctionsDataContext();
db.Auction.Add(auction);
db.SaveChanges();
return RedirectToAction("Index");
}
return View();
}

Action is already apart of the DbContext class as a DbSet. Also the view already sends the Model information back you don't need that as an overloaded parameter. Change your create post to
public class AuctionsController : Controller
{
private readonly AuctionsDataContext_context;
public AuctionsController(AuctionsDataContext context)
{
_context = context;
}
public ActionResult Create ( Bind[("Id,Title,StartDate,EndDate,DeliveryCost,StartBid,BuyNowPrice,BuyNowEnabled,Description")] Auction auction)
{
if (ModelState.IsValid)
{
_context.Add(auction);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View();
}

Related

How to edit files in a database with razor?

I want to create razor pages that perform CRUD operations on files in a sql database. I managed to upload files to the database using IFormFile and MemoryStream but I am not able to update/replace them in the same way. When I select the new file and click on Save, I get a message that no file was selected.
I tried the following code
File.cs
namespace MyApp.Models
{
public class File
{
public string Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public byte[]? Content { get; set; }
}
}
Edit.cshtml
#page
#model MyApp.Pages.Files.EditModel
#{
ViewData["Title"] = "Edit";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>Edit</h1>
<h4>File</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="File.Id" />
<div class="form-group">
<label asp-for="File.Title" class="control-label"></label>
<input asp-for="File.Title" class="form-control" />
<span asp-validation-for="File.Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="File.Description" class="control-label"></label>
<input asp-for="File.Description" class="form-control" />
<span asp-validation-for="File.Description" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FileUpload.FormFile"></label>
<input asp-for="FileUpload.FormFile" type="file">
<span asp-validation-for="FileUpload.FormFile"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-page="./Index">Back to List</a>
</div>
#section Scripts {
#{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Edit.cshtml.cs
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using MyApp.Data;
using MyApp.Models;
namespace MyApp.Pages.Files
{
public class EditModel : PageModel
{
private readonly ApplicationDbContext _context;
public EditModel(ApplicationDbContext context)
{
_context = context;
}
[BindProperty]
public File File { get; set; }
[BindProperty]
public BufferedSingleFileUploadDb FileUpload { get; set; }
public class BufferedSingleFileUploadDb
{
[Required]
[Display(Name = "File")]
public IFormFile FormFile { get; set; }
}
public async Task<IActionResult> OnGetAsync(string id)
{
if (id == null)
{
return NotFound();
}
File = await _context.File.FirstOrDefaultAsync(m => m.Id == id);
if (File == null)
{
return NotFound();
}
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
using (var memoryStream = new MemoryStream())
{
await FileUpload.FormFile.CopyToAsync(memoryStream);
// Upload the file if less than 2 MB
if (memoryStream.Length < 2097152)
{
File.Content = memoryStream.ToArray();
}
else
{
ModelState.AddModelError("File", "The file is too large.");
}
}
_context.Attach(File).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!FileExists(File.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToPage("./Index");
}
private bool FileExists(string id)
{
return _context.File.Any(e => e.Id == id);
}
}
}
Add enctype="multipart/form-data" to your form element. –
Mike Brind

passing array from angular js to Web API = null

Dears, I am sending an object from angularjs to web API. all properties are sent to API and received correctly except 2 arrays, they are received by null in c# with out knowing a reason so if you could help it will be great
in the department (dep)array i am sending 1 value $scope.dep
in the cont array i am sending multipule values , may be pushing to the array is not correctly, i dont know
HTML
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">
<div class="form-group">
<div class="col-xs-12">
<label class="control-label" for="name">Contracts <span class="danger">*</span></label>
</div>
<div class="col-xs-12">
<select id="example-post" class="form-control input-sm" multiple="multiple" ng-model="cont" ng-change="addcontracts(cont)">
<option ng-repeat="c in selectedcontracts" value="{{c.Sys_Key}}">{{c.Cont}}</option>
</select>
</div>
</div>
</div>
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">
<div class="form-group">
<div class="col-xs-12">
<label class="control-label" for="name">Department <span class="danger">*</span></label>
</div>
<div class="col-xs-12">
<select class="form-control input-sm" ng-model="dep" ng-options="d.Dep_key as d.dep for d in staffdepartments | unique:'dep'"></select>
</div>
</div>
</div>
Angular js
this.Repttx_PayRollTotal_Net = function (url, Attendlog) {
return $http.post(urlBase + '/' + url, Attendlog)
};
$scope.newcontracts = [];
$scope.addcontracts = function (cont) {
console.log(cont);
$scope.newcontracts = [];
$scope.newcontracts.push(cont) ;
console.log($scope.newcontracts);
}
var Attendlog = { DFrom: $scope.from1, Fg: $scope.fg, StaffKey: $scope.staffkey, StatusServ: $scope.jbsts, Cont: JSON.stringify($scope.newcontracts), Order: $scope.sor }
AtendanceReprtingSrv.Repttx_PayRollTotal_Net("AttendanceReprting/Repttx_PayRollTotal_Net", Attendlog).then(function (response) {
$scope.ttx = (response.data);
document.getElementById("frmrepodbc").src = $scope.ttx;
$("#dialog_PrintRptObc").modal("show");
})
C# class and its properties
public class Attendlogs
{
public DateTime DFrom { get; set; }
public short Fg { get; set; }
public long StaffKey { get; set; }
public int StatusServ { get; set; }
public int[] Dep { get; set; }
public int[] Cont { get; set; }
public int Order { get; set; }
}
C#
[HttpPost]
public string Repttx_PayRollTotal_Net([FromBody] Attendlogs logs)
{
DataTable DTres = new DataTable();
DTres = null;
HR_ReportingTimeAttendDL.ReportiingDL hr = new HR_ReportingTimeAttendDL.ReportiingDL();
DTres = hr.AttendLog(logs.DFrom, logs.Fg, logs.StaffKey, logs.StatusServ, logs.Dep, logs.Cont, logs.Order);
Thanks in advance
you are sending the arrays as objects to your api
Cont: JSON.stringify($scope.newcontracts)
you might need to loop on your data and push ids into arrays , and send this array to Backend
because at the model on Attendlogs class on the Backend side , you are expecting an integer array.

How to display the last inserted ID (primary key) of a table in a html textbox that is in a relationship with a foreign key of another table in mvc

I'm new to asp.net and MVC, and I have a problem.
I know that this is something simple but I do not know how to do it. I seek advice and would like to thank you in advance for any help.
This is my problem:
I have 2 tables: table X: ID (primary key), Number; and table Y: ID (primary key), NID (foreign key with relationship with table X), etc.
What I want to know is how to display last inserted ID into the view of table Y on an Html editor for NID the last value of ID (table X)?
For example, I create a new row in table X, and when I want to create the row in table Y that corresponds with table X to automatically get the last ID inserted in the textbox or editor?
Can anybody give me some kind of reference or an example! Thank you for your help! Sorry for any bad spelling.
Here we go . I tested this and it returned me the model properties along with files posted . This example gives you ideea how POSt method used in MVC and how to send model propertied back to controller .
//-- this is the controller
public class FileUploadDemoController : Controller
{
//
// GET: /FileUploadDemo/
public ActionResult Index()
{
// here find the last if of the FileUploadtable
var ctx = new TestDbContext();
var maxId = ctx.Fileuploads.ToList().OrderByDescending(u => u.Id).FirstOrDefault();
var newId = maxId == null ? 1 : maxId.Id + 1;
return View("Index", new FileUploadModel { Id= newId });
}
[HttpPost]
public ActionResult PostForm(FileUploadModel model)
{
// here you have NewId in model.Id method ; Now ypour table b in my case is fileeuploadhistory I want to insert a new record with this model.Id
using (var ctx = new TestDbContext())
{
var curretFile = ctx.Fileuploads.FirstOrDefault(x => x.Id == model.Id);
if (curretFile==null)
{
curretFile=new FileUploadModel { Name=model.Name , ValidFromDate= model.ValidFromDate};
}
curretFile.History = new FileUploadHistory { InsertedDate = DateTime.Now };
ctx.Fileuploads.Add(curretFile);
ctx.SaveChanges();
}
return View("Index", model);
}
}
-- These are MY EntityFramework entities and I am using same on Views as well
public class FileUploadModel
{
public FileUploadModel()
{
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string ValidFromDate { get; set; }
public int HistoryId { get; set; }
[ForeignKeyAttribute("HistoryId")]
public virtual FileUploadHistory History { get; set; }
}
public class FileUploadHistory
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime InsertedDate { get; set; }
}
-- Finaly the cshml file . The import point is to use new { enctype = "multipart/form-data" } inside BeginForm . // the page from where you will post the data . Please change you model class in place of FileUploadModel I created for me .
#model WebApplication1.Models.FileUploadModel
#using (Html.BeginForm("PostForm", "FileUploadDemo", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="panel">
<div class="panel-body">
<div class="form-group row">
<div class="col-md-2 form-label">
<label>ID:</label>
</div>
<div class="col-md-6">
#Html.TextAreaFor(x => x.Id , new { #class = "form-control" })
</div>
</div>
<div class="form-group row">
<div class="col-md-2 form-label">
<label>Name:</label>
</div>
<div class="col-md-6">
#Html.TextAreaFor(x => x.Name, new { #class = "form-control" })
</div>
</div>
<div class="form-group row">
<div class="col-md-2 form-label">
<label>Date</label>
</div>
<div class="col-md-6">
#Html.TextAreaFor(x => x.ValidFromDate, new { #class = "form-control" })
</div>
</div>
<div class="col-md-10">
<div class="form-group row">
<div class="col-md-2 form-label">
<label>Select File<i class="required-field">*</i>:</label>
</div>
<div class="col-md-8">
<input type="file" class="file-upload" style="margin: 0px;" hidden="hidden" accept=".xlsx" name="file" id="file" />
</div>
</div>
</div>
<div class="form-group row">
<div class="col-md-3 pull-right text-right">
<button class="btn btn-primary" id="process-submission" type="submit">
Submit
</button>
</div>
</div>
</div>
</div>
}

Display value on textbox on change of the date

Good Day! I am a newbie on ASP.NET (MVC) and trying to display a value (from a Stored Procedure) after the value of the date has been changed. This is what it looks like on the design Once the date is picked, the user will click the Create button and the value should be displayed on the "Sales" textbox
This is my Stored Procedure for it
CREATE PROCEDURE [dbo].[SP_DAILY_SALES]
-- Add the parameters for the stored procedure here
#Order_date date
AS
BEGIN TRANSACTION;
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
BEGIN TRY
SET NOCOUNT OFF;
DECLARE #SumTable table
(
dailySales decimal (18,2)
)
DECLARE #dailySales decimal(18,2)
SET #dailySales = (
SELECT SUM(NET_AMOUNT)
FROM [ORDER]
WHERE ORDER_DATE=#Order_date)
INSERT INTO #SumTable (dailySales)
VALUES (#dailySales)
-- Insert statements for procedure here
SELECT dailySales
FROM #SumTable
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH;
and this is where I call it (Repository)
public bool DisplayDailySales(DateTime orderdate)
{
connection();
SqlCommand com = new SqlCommand("SP_DAILY_SALES", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add("#Order_date", SqlDbType.DateTime).Value = orderdate;
con.Open();
int i = com.ExecuteNonQuery();
con.Close();
if (i >= 1)
{
return true;
}
else
{
return false;
}
}
My Controller
[HttpGet]
public ActionResult Statistics()
{
OrderVM dSales = new OrderVM();
var currentdate = DateTime.Now;
dSales.ORDER_DATE = currentdate;
return View();
}
[HttpPost]
public ActionResult Statistics(OrderVM order)
{
try
{
DateTime orderdate = order.ORDER_DATE;
ViewData["ORDERDATE"] = orderdate;
if (ModelState.IsValid)
{
OrderRepository orderRepo = new OrderRepository();
orderRepo.DisplayDailySales(orderdate);
}
return View();
}
catch
{
return View();
}
}
And lastly, in my view as of now is this
<div class="panel-body">
#using (Html.BeginForm())
{
#Html.AntiForgeryToken()
#Html.ValidationSummary(true)
<div class="form-horizontal">
<div class="form-group">
#Html.LabelFor(model => model.ORDER_DATE, "Date", htmlAttributes: new { #class = "col-xs-4 col-sm-offset-1 col-sm-4" })
<div class="col-lg-6 col-lg-6 col-md-6 col-md-6 col-sm-6 col-sm-6 col-xs-6 col-xs-6">
#Html.TextBoxFor(model => model.ORDER_DATE, "{0:yyyy-MM-dd}", new { #class = "form-control", #type = "date", #id = "Orderdate" })
#Html.ValidationMessageFor(model => model.ORDER_DATE, "", new { #class = "text-danger" })
</div>
</div>
<div class="form-group">
#Html.LabelFor(model => model.dailySales, "Sales", htmlAttributes: new { #class = "col-xs-4 col-sm-offset-1 col-sm-4" })
<div class="col-lg-6 col-lg-6 col-md-6 col-md-6 col-sm-6 col-sm-6 col-xs-6 col-xs-6">
#Html.TextBoxFor(model => model.dailySales, new { #class = "form-control" })
#Html.ValidationMessageFor(model => model.dailySales, "", new { #class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-lg-3 pull-right">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</div>
</div>
}
</div>
Hope someone can help me out on this. Thank You!

Error - model sent to the view is incorrect

I am getting following error message.Could somebody tell me why I am getting the following error message. My model is getting initialized with values when I debug the controller.
The model item passed into the dictionary is of type 'AngularJSMvcExample.Models.RegistrationVm', but this dictionary requires a model item of type 'System.String'.
My model code
namespace AngularJSMvcExample.Models
{
public class RegistrationVm
{
public string Courses { get; set; }
public string Instructors { get; set; }
}
}
My Controller code
namespace AngularJSMvcExample.Controllers
{
public class RegistrationController : Controller
{
private RegistrationVmBuilder _registrationVmBuilder = new RegistrationVmBuilder();
// GET: Registration
public ActionResult Index()
{
return View(_registrationVmBuilder.BuildRegistrationVm());
}
}
}
My ViewCode
#model AngularJSMvcExample.Models.RegistrationVm
#{
ViewBag.Title = "Registration";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container" ng-controller="RegistrationController">
<div class="row">
<div class="navbar navbar-default">
<div class="navbar-header">
<ul class="nav navbar-nav">
<li>
<span class="navbar-brand">Registration</span>
</li>
</ul>
</div>
<div class="navbar-collapse collapse">
<ul class="nav nav-bar">
<li >Browse Catalog</li>
<li>Browse Instructors</li>
</ul>
</div>
</div>
</div>
</div>
My RegistrationVmBuilder code
namespace AngularJSMvcExample.Models
{
public class RegistrationVmBuilder
{
public RegistrationVm BuildRegistrationVm()
{
var registrationVm = new RegistrationVm
{
Courses = GetSerialisedCourse(),
Instructors = GetSerialisedInstructors()
};
return registrationVm;
}
public string GetSerialisedCourse()
{
var courses = new[]
{
new CourseVm {Number= "100", Name= "Physis", Instructor = "Jan"},
new CourseVm {Number= "101", Name= "Chemistry", Instructor = "Sal"},
new CourseVm {Number= "102", Name= "Biology", Instructor = "San"},
new CourseVm {Number= "103", Name= "History", Instructor = "Jack"},
new CourseVm {Number= "104", Name= "Maths", Instructor = "Rahul"}
};
var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
var serializeCourses = JsonConvert.SerializeObject(courses, settings);
return serializeCourses;
}
public string GetSerialisedInstructors()
{
var instructors = new[]
{
new InstructorsVm {Name= "Jan", Email= "jan.test#test.com", Roomno = "10"},
new InstructorsVm {Name= "Pal", Email= "pal.test#test.com", Roomno = "9"},
new InstructorsVm {Name= "San", Email= "san#test.com", Roomno = "11"},
new InstructorsVm {Name= "Jack", Email= "jack#test#test.com", Roomno = "12"},
new InstructorsVm {Name= "Rahul", Email= "rahul#test#test.com", Roomno = "15"}
};
var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
var serializeInstructors = JsonConvert.SerializeObject(instructors, settings);
return serializeInstructors;
}
}
}
Are you sure this is the index view?
#model AngularJSMvcExample.Models.RegistrationVm
#{
ViewBag.Title = "Registration";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container" ng-controller="RegistrationController">
<div class="row">
<div class="navbar navbar-default">
<div class="navbar-header">
<ul class="nav navbar-nav">
<li>
<span class="navbar-brand">Registration</span>
</li>
</ul>
</div>
<div class="navbar-collapse collapse">
<ul class="nav nav-bar">
<li >Browse Catalog</li>
<li>Browse Instructors</li>
</ul>
</div>
</div>
</div>

Resources