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