Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 3 Layout Page, Razor Template, and DropdownList

I want to include a drop down list of years across all the pages in my website. I assumed a good place to put this logic was in the layout page (_layout.cshtml). If a user changes the year I want to change my year session (ModelBinder) to change as well. This was so easy to do with ASP.NET web forms, but seems near impossible to do in MVC. I tried a partial view with no luck. Anybody have any ideas?

like image 563
Sam Stange Avatar asked Jan 12 '11 21:01

Sam Stange


1 Answers

As usual you could start by defining a view model:

public class YearsViewModel {     public string Year { get; set; }     public IEnumerable<SelectListItem> Years     {         get         {             return new SelectList(                 Enumerable.Range(1900, 112)                 .OrderByDescending(year => year)                 .Select(year => new SelectListItem                 {                     Value = year.ToString(),                     Text = year.ToString()                 }             ), "Value", "Text");         }     } } 

Then a controller:

public class YearsController : Controller {     public ActionResult Index()     {         return View(new YearsViewModel());     }      [HttpPost]     public ActionResult Index(int year)     {         // TODO: do something with the selected year         return new EmptyResult();     } } 

and a corresponding view for the index action:

@model SomeAppName.Models.YearsViewModel @{     Layout = null; } @Html.DropDownListFor(x => x.Year, Model.Years) 

And finally inside your _Layout.cshtml you could use this controller:

<div id="selectyear">@Html.Action("index", "years")</div> 

and attach a corresponding script which would send an AJAX request when the value changes:

$(function () {     $('#selectyear select').change(function () {         $.post('@Url.Action("index", "years")', { year: $(this).val() }, function (result) {          });     }); }); 
like image 170
Darin Dimitrov Avatar answered Oct 04 '22 21:10

Darin Dimitrov