使用@ Html.HiddenFor渲染隐藏的表单字段

时间:2012-05-25 13:31:39

标签: c# asp.net-mvc-3 nullable datetime-format

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 =&gt; c.CurrentViewDate.Value),但后来就     重新发布formModel.CurrentViewDate具有null值,因为绑定名称不同。

有什么想法吗?感觉它从StartDate属性而不是CurrentViewDate属性

获取日期时间值

1 个答案:

答案 0 :(得分: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。