2012-05-25 2 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). 그러나 에 formModel.CurrentViewDate에 바인딩 이름이 다르므로 null 값이 있습니다.@ Html.HiddenFor

아이디어가 있으십니까?

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

이유를 당신은이 작업을 수행 할 필요가 : 그것은 startDate 프로퍼티와 대신 CurrentViewDate 호텔에서 날짜 시간 값을 가져 오는 것 당신이 그것을 수정하려는 경우 당신은 ModelState에서 값을 제거해야

답변

2

느낌 왜냐하면 TextBoxFor, HiddenFor, CheckBoxFor와 같은 모든 HTML 도우미는 ... ModelState에서 값을 바인딩 할 때 먼저 살펴보고 모델을 살펴 봅니다. 이것은 의도적으로 설계된 동작입니다. 그래서 POST 작업에는 ModelState (요청과 함께 전송 된 값)에 값이 이미 있으므로이 값이 사용됩니다.

POST 컨트롤러 동작 내에서 뷰 모델의 일부 속성을 수정할 때마다이 변경 내용이 값에 반영 될 때마다 ModelState에 대해 잊지 마십시오.

+0

Genuis !!! :-) 그게 효과가! – user357086

관련 문제