Страница макета MVC 3, шаблон бритвы и DropdownList - PullRequest
33 голосов
/ 13 января 2011

Я хочу включить выпадающий список лет на всех страницах моего сайта. Я предположил, что хорошее место для размещения этой логики было на странице макета (_layout.cshtml). Если пользователь меняет год, я также хочу изменить сеанс года (ModelBinder). Это было так легко сделать с веб-формами ASP.NET, но в MVC это практически невозможно. Я попробовал частичное представление без удачи. У кого-нибудь есть идеи?

1 Ответ

88 голосов
/ 13 января 2011

Как обычно, вы можете начать с определения модели представления:

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

Затем контроллер:

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

и соответствующее представление для действия индекса:

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

И, наконец, внутри вашего _Layout.cshtml вы можете использовать этот контроллер:

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

и присоединить соответствующий скрипт, который будет отправлять запрос AJAX при изменении значения:

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

        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...