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);
}
'ModelState.Clear(); 그것은 완벽하게 작동합니다. 이유를 설명해 주시겠습니까? – cashmere
내 하루를 저장했습니다. 하지만 explaination 좋은 것입니다 :) –