2011-01-12 18 views
33

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?Página de diseño de MVC 3, plantilla de maquinilla de afeitar y lista desplegable

+0

Qué problema particular están experimentando? – marcind

Respuesta

88

Como es habitual se podría empezar por definir una vista de modelo:

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

Luego de 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 a la acción index:

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

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

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

y adjuntar una escritura correspondiente que enviaría una petición AJAX cuando el valor cambia:

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

     }); 
    }); 
}); 
+1

Perfecto !!!! ¡Muchas gracias por la ayuda! –

+0

@Sam, eres bienvenido. –

+0

Impresionante. Lo adaptó para un selector de país sin ningún problema. Gracias cargas. –

Cuestiones relacionadas