MVC 3 Mise en Page, Modèle de Rasoir, et DropdownList

je veux inclure une liste déroulante des années à travers toutes les pages de mon site. J'ai supposé qu'un bon endroit pour mettre cette logique était dans la page de mise en page (_layout.cshtml). Si un utilisateur change l'année, je veux changer ma session de L'année (ModelBinder) pour changer aussi. C'était si facile à faire avec ASP.NET formulaires web, mais semble presque impossible à faire dans MVC. J'ai essayé une vue partielle sans succès. Quelqu'un a des idées?

33
demandé sur Darin Dimitrov 2011-01-13 00:02:35

1 réponses

comme d'habitude vous pouvez commencer par définir un modèle de vue:

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

un contrôleur:

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

et une vue correspondante pour l'action index:

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

Et enfin à l'intérieur de votre _Layout.cshtml vous pouvez utiliser ce contrôleur:

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

et joindre un correspondant script qui permettrait d'envoyer une requête AJAX lors de la modification de la valeur:

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

        });
    });
});
88
répondu Darin Dimitrov 2011-01-13 10:04:50