Создавать кнопки Next и Prev без использования каких-либо параметров запроса?

#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 .