2011-02-03 2 views
8

내보기에서Html.TextBoxFor는 POST 작업에서 업데이트 된 값을 표시하지 않습니다.

  <%:Html.LabelFor(model => model.IPAddress)%> 

    <div class="editor-field"> 
     <%:Html.TextBoxFor(model => model.IPAddress)%> 
     <%:Html.ValidationMessageFor(model => model.IPAddress)%> 
    </div> 

내 컨트롤러 (게시 ​​방법) 있음,이

[HttpPost] 
public ActionResult Manipulation(MyModel model){ 
    //I change modele here 
    if(somthing) 
    model.IPAddress="100.100.100.100"; 
    return View(model); 
} 

그래서 내 질문 : 모델을 변경할 때 TextBoxFor 자신의 값을 변경하지 않습니다 . TextBoxFor 메소드에서 get 메서드를 얻을 때 값을 가져오고 나중에 TextBoxFor 값을 변경할 수 없습니다. 디버깅하고 모델에 새로운 값이 있지만 TextBoxFor에 새 값이 표시되지 않습니다.

도와 주시겠습니까?

답변

11

시도 :

ModelState.Clear(); 
return View(model); 

경우를 초래하지! JSON 결과를 반환 한 다음 자바 스크립트로 업데이트하십시오.

+1

'ModelState.Clear(); 그것은 완벽하게 작동합니다. 이유를 설명해 주시겠습니까? – cashmere

+0

내 하루를 저장했습니다. 하지만 explaination 좋은 것입니다 :) –

1

모델 바인딩을 사용하는 대신 tryupdate 호출을 사용하는 것이 좋습니다.

[HttpPost] 
public ActionResult Manipulation(FormCollection formCollection) 
{ 
    MyModel model = new MyModel(); 

    if(TryUpdate(Model)) 
    { 
     enter code here 
    } 

    if(somthing) 
    model.IPAddress="100.100.100.100"; 
    return View(model); 
} 

내가 사용하는 일반적인 구조에 대한 다른 답변을 확인하십시오. 그 전에는 절대로 실패하지 않았으며 사용자 입력에서 모델을 업데이트 할 때 모든 기반을 다룰 것이라고 생각합니다.

asp.net mvc controller post best practices

+0

모델이 포함 된 viewmodel과 같이 중첩 된 유형 인 경우 tryupdate 모델의 접두사 오버로드가 필요할 수 있습니다. – Manatherin

0

Mr. Grok이 (가) this 비슷한 문제를 가지고 있습니다. 그는 이미 ModelState.Clear() 솔루션을 찾았지만 왜 효과가 있었는지에 대한 설명을 원했습니다. 링크 된 사이트에서 가장 높은 순위의 답변은 HTML 도우미의 동작이 ModelState.Clear()가 해결 방법 인 버그라고 제안했습니다. 그러나 this의 bradwils는이 동작이 의도적으로 설계된 것이며 다음과 같은 설명을 제공합니다.

게시자가 모델 값 대신 게시자 값을 사용하는 이유는 모델에 해당 값이 포함될 수 없기 때문입니다. 사용자가 입력 한 값. 사용자가 "개"라고 입력 한 "int"편집기에서 상상해보십시오. "dog is not valid"라는 오류 메시지를 표시하고 편집기 필드에 "dog"를 남기고 싶습니다. 그러나 모델은 int입니다 : "dog"를 저장할 수있는 방법은 없습니다. 그래서 우리는 오래된 가치를 지킵니다.

이전 값을 편집기에 표시하지 않으려면 모델 상태를 지우십시오. 바로 이전 값이 저장되고 HTML 도우미에서 가져옵니다.

이것은 의도적으로 설계된 것이지만 개발자에게는 매우 예상치 못한 동작이며 일반적인 프로그래밍 요구 사항에 ModelState와의 상호 작용이 필요하다는 것은 불행한 일입니다.

또한 ModelState 전체를 지우면 관련이없는 모델 필드의 유효성 검사와 관련하여 다른 영역에서 예기치 않은 문제가 발생할 수 있습니다. 보다 제한된 ModelState.Remove ("key")을 제안한 Peter Gluck (Mr. Grok의 의견에 응답)와 확신이 없을 때 더 편리한 방법을 개발 한 Toby J에게 감사드립니다. 모델 속성이 중첩 된 경우 키가 있어야합니다. 또한 Toby의 메서드는 문자열을 입력으로 사용하지 않기 때문에 좋습니다.

방법은, 사소한 변경과 함께, 다음 그건 :

/// <summary> 
/// Removes the ModelState entry corresponding to the specified property on the model. Call this when changing 
/// Model values on the server after a postback, to prevent ModelState entries from taking precedence. 
/// </summary> 
/// <param name="model">The viewmodel that was passed in from a view, and which will be returned to a view</param> 
/// <param name="propertyFetcher">A lambda expression that selects a property from the viewmodel in which to clear the ModelState information</param> 
/// <remarks> 
/// Code from Tobi J at https://stackoverflow.com/questions/1775170/asp-net-mvc-modelstate-clear 
/// Also see comments by Peter Gluck, Metro Smurf and Proviste 
/// Finally, see Bradwils http://forums.asp.net/p/1527149/3687407.aspx. 
/// </remarks> 
public static void RemoveStateFor<TModel, TProperty>(
    this ModelStateDictionary modelState, 
    TModel model, 
    Expression<Func<TModel, TProperty>> propertyFetcher 
) { 
    var key = ExpressionHelper.GetExpressionText(propertyFetcher); 

    modelState.Remove(key); 
} 
0

여기 내가 찾은 또 다른 일을 주위입니다. 당신은 모든 입력의 기본 동작을 재정의하지 않으려면 대신

@Html.TextBoxFor(m=>m.PropertyName) 

의이

@{ 
var myModel = Model; 
} 
@Html.TextBoxFor(m=>myModel.PropertyName) 

이 유용 할 수 않습니다.

관련 문제