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" />

しかし、送信をクリックすると値が増加しますが、非表示の for フィールドは前の値を保持し、正しい値を表示する唯一の方法は If do this @Html.HiddenFor(c => c.CurrentViewDate.Value) ですが、その後バインディング名が異なるため、formModel.CurrentViewDate の再投稿には null 値があります。

何か案は?CurrentViewDate プロパティではなく、StartDate プロパティから日時値を取得しているように感じます

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);
}

これを行う必要があるのは、TextBoxFor、HiddenFor、CheckBoxFor などのすべての Html ヘルパーが、値をバインドするときに最初に ModelState を調べ、その後モデルを調べるためです。この動作は仕様です。したがって、POST アクションではすでに ModelState (リクエストと共に送信されたもの) に値が存在するため、使用されているのはこの値です。

POST コントローラー アクション内でビュー モデルのプロパティを変更しようとし、この変更が値に反映されることを期待するたびに、ModelState を忘れないでください。

于 2012-05-25T13:38:49.873 に答える