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?
Asked
Active
Viewed 6.3k times
33
-
What particular problem are you experiencing? – marcind Jan 12 '11 at 21:44
1 Answers
88
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) {
});
});
});

Darin Dimitrov
- 1,023,142
- 271
- 3,287
- 2,928
-
Awesome. Adapted it for a country selector with no trouble at all. Thanks loads. – Roberto Bonini May 07 '11 at 18:20
-
1This was very helpful in providing a clear implementation of ASP.NET MVC. There's a lot more to learn here than just how to put a drop down on the page, Thank you. – hanzolo Apr 21 '12 at 06:53
-
@DarinDimitrov Hi. thanks that great work. but one doubt how i will do it using ViewBag. I need to bind dropdown in layout page using viewbag r session. because if i specified "@model SomeAppName.Models.YearsViewModel" in my layout page means i cannot able to pass any model from my content page to view like return view("home",Detail) because here the layout except yearviewmodel. so it will throw error. – Ryder Jun 24 '14 at 05:56