#c# #asp.net-mvc #asp.net-mvc-3
#c# #asp.net-mvc #asp.net-mvc-3
Вопрос:
Я хочу отобразить календарь на три месяца с помощью кнопки Next для отображения следующих 3 месяцев и кнопки prev для отображения предыдущих 3 месяцев.Моя модель содержит свойство с именем BeginDate
, значение которого равно дате первого дня текущего 3 месяца.Когда я нажимаю кнопку next, я добавляю три месяца к BeginDate
и привязываю его к скрытому полю в моем представлении. и вернуть модель с новым BeginDate
значением, но значение скрытого поля не изменилось.
Моя модель
public class MyModel
{
public DateTime BeginDate
{
get;
set;
}
}
мой контроллер
[HttpGet]
public ActionResult Index()
{
return View(new MyModel());
}
[HttpPost]
public ActionResult Index(MyModel model)
{
model.BeginDate = model.BeginDate.AddMonths(3);
return View(model);
}
Обратите внимание, я хочу сделать это, не добавляя никаких параметров в свой URL
Ответ №1:
Вам нужно удалить его из состояния модели, если вы намерены изменить его значение в действии POST:
[HttpPost]
public ActionResult Index(MyModel model)
{
ModelState.Remove("CurrentBegin");
model.CurrentBegin = DateTime.Parse(Request.Form["CurrentBegin"]).AddMonths(3);
return Index(model);
}
Причина этого в том, что HTML-помощники, такие как TextBoxFor, HiddenFor, …, сначала проверят запрос, есть ли соответствующее значение, а затем в модели. Поскольку вы находитесь в действии POST, в теле POST есть старое CurrentBegin
значение, и именно оно будет использоваться скрытым помощником, а не тем, которое вы вводите в модель. Это задумано, и именно так работают помощники. Если вы хотите использовать значение модели и игнорировать опубликованное значение, вам нужно удалить его из состояния модели, как показано.
Комментарии:
1. Почему, например, «Html.DisplayFor» не просматривает запрос раньше?
2. @Peter Gfader, потому что шаблон отображения по умолчанию для строкового свойства выглядит следующим образом:
@Html.Encode(ViewData.TemplateInfo.FormattedModelValue)
который в основном использует значение модели, а не modelstate или request .