Página de diseño de MVC 3, plantilla de rastrillo y lista desplegable

Quiero incluir una lista desplegable de años en todas las páginas de mi sitio web. Supuse que era un buen lugar para poner esta lógica en la página de diseño (_layout.cshtml). Si un usuario cambia el año, quiero cambiar también la sesión de mi año (ModelBinder). Esto fue muy fácil de hacer con los formularios web ASP.NET, pero parece casi imposible de hacer en MVC. Intenté una vista parcial sin suerte. ¿Alguien tiene ideas?

Como de costumbre, puede comenzar definiendo un modelo de vista:

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

Entonces un controlador:

 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(); } } 

y una vista correspondiente para la acción de índice:

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

Y finalmente dentro de su _Layout.cshtml puede usar este controlador:

 
@Html.Action("index", "years")

y adjunte una secuencia de comandos correspondiente que enviaría una solicitud AJAX cuando el valor cambie:

 $(function () { $('#selectyear select').change(function () { $.post('@Url.Action("index", "years")', { year: $(this).val() }, function (result) { }); }); });