Я хочу включить раскрывающийся список лет на все страницы моего веб-сайта. Я предпочел, чтобы это логично было на странице макета (_layout.cshtml). Если пользователь меняет год, я хочу изменить свою сессию года (ModelBinder), чтобы изменить ее. Это было так легко сделать с веб-формами ASP.NET, но в MVC почти невозможно сделать. Я попробовал частичное представление без везения. У кого-нибудь есть идеи?
Страница компоновки MVC 3, шаблон Razor и DropdownList
Ответ 1
Как обычно, вы можете начать с определения модели представления:
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>
и присоедините соответствующий script, который отправит запрос AJAX при изменении значения:
$(function () {
$('#selectyear select').change(function () {
$.post('@Url.Action("index", "years")', { year: $(this).val() }, function (result) {
});
});
});