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?
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) { }); }); });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With