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) ,然后打开重新发布 formModel.CurrentViewDate 具有空值,因为绑定名称不同。

有任何想法吗?感觉像是从 StartDate 属性而不是 CurrentViewDate 属性获取日期时间值

4

1 回答 1

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。

于 2012-05-25T13:38:49.873 回答