2012-05-25 3 views
1
public class SearchForm { 

    //Note: Property is nullable 
    public DateTime? CurrentViewDate {get;set;}  
    public DateTime StartDate {get;set;} 
} 

//In the controller  
//[GET] 
public ActionResult Index() 
{ 
} 

//[POST]  
public ActionResult Index(SearchForm formModel) 
{ 
    if(formModel.CurrentViewDate == null)    
     formModel.CurrentViewDate = DateTime.Now.AddDays(1d); 
    else 
     formModel.CurrentViewDate = formModel.CurrentViewDate.AddDays(1d); 

    formModel.StartDate = DateTime.Now; 

} 


//In view 
@Html.HiddenFor(c => c.CurrentViewDate). 
<input id="SearchForm_CurrentViewDate" name="SearchForm.CurrentViewDate" 
     type="hidden" value="5/25/2012 11:59:59 PM" /> 
<input type="submit" name="btnNext" id="btnNext" value="Go Increment" /> 

Но, когда нажмите на кнопку отправить значение имеет получает приращение, но скрытое за поле содержит предыдущее значение, и единственный способ это показывает правильное значение Если это сделать @Html .HiddenFor (c => c.CurrentViewDate.Value), но затем на повторите отправку формыModel.CurrentViewDate имеет нулевое значение, так как имена привязки разные.Rendering скрытое поле формы с помощью @ Html.HiddenFor

Любые идеи? Такое ощущение, что она извлекает значение времени даты из StartDate имущества вместо CurrentViewDate собственности

ответ

2

Вы должны удалить значение из ModelState, если вы намерены изменить его:

public ActionResult Index(SearchForm formModel) 
{ 
    ModelState.Remove("CurrentViewDate"); 

    if(formModel.CurrentViewDate == null)    
    { 
     formModel.CurrentViewDate = DateTime.Now.AddDays(1d); 
    } 
    else 
    { 
     formModel.CurrentViewDate = formModel.CurrentViewDate.AddDays(1d); 
    } 

    return View(model); 
} 

Причина вы должны сделать это потому что все помощники Html, такие как TextBoxFor, HiddenFor, CheckBoxFor, ... сначала смотрят в ModelState при привязке их значений, и после этого они смотрят в модели. Такое поведение является особенностью. Поэтому, поскольку в вашем действии POST уже есть значение в ModelState (тот, который был отправлен с запросом), это значение используется.

Каждый раз, когда вы пытаетесь изменить какое-либо свойство в своей модели просмотра внутри действия контроллера POST и ожидаете, что это изменение отразится на значении, не забудьте о ModelState.

+0

Genuis !!! :-) Это работает!! – user357086

Смежные вопросы