2

ASP.NET 코어에서 asp-* 속성 (예 : asp-for)의 값은 모델 이전의 요청 페이로드에서 가져온 것으로 보입니다. 예 :ASP.NET 코어 : asp- * 특성은 모델에 대한 요청 페이로드를 사용합니까?

후이 값이 조치를

MyProperty="User entered value." 

:

<input asp-for="MyProperty" /> 
:

[HttpPost] 
public IActionResult Foo(MyModel m) 
{ 
    m.MyProperty = "Change it to this!"; 
    return View(); 
} 

또는이 작업

[HttpPost] 
public IActionResult Foo(MyModel m) 
{ 
    m.MyProperty = "Change it to this!"; 
    return View(m); 
} 

보기이 렌더링

양식 입력의 값은 User entered value.이고 Change it to this!이 아닙니다.

우선, 우리는 모델을보기에 전달할 필요가없고 놀랍습니다. 둘째, 요청 페이로드가 뷰에 전달 된 모델보다 우선한다는 점에 저는 놀랍습니다. 누구나이 디자인 결정의 근거가 무엇인지 알 수 있습니까? asp-for 속성을 사용할 때 사용자가 입력 한 값을 덮어 쓰는 방법이 있습니까?

답변

2

나는이 예상 된 동작/에 의해 믿습니다. 양식을 제출하면 양식 데이터가 ModelState 사전에 저장되고 면도기가 양식 요소를 렌더링 할 때 Model 상태 사전의 값이 사용됩니다. 따라서보기 모델의 객체를 View() 메소드로 전달하지 않을 때에도 양식 요소 값을 볼 수 있습니다.

입력 값을 업데이트하려면 모델 상태 사전을 명시 적으로 삭제해야합니다. 그렇게하려면 ModelState.Clear() 방법을 사용할 수 있습니다.

[HttpPost] 
public IActionResult Create(YourviewModel model) 
{  
    ModelState.Clear(); 
    model.YourProperty = "New Value"; 
    return View(model); 
} 

는 form 요소 값을 렌더링 모델 상태 사전을 사용하는 이유는 검증 오류가 발생있을 때 형태로 이전에 전송 된 값을 도시처럼 사용 사례를 지원하는 것이다.

편집 : aspnet mvc의 공식 github 저장소에 대한 링크를 찾았습니다. this is confirmed by Eilon (asp.순 팀원)

https://github.com/aspnet/Mvc/issues/4486#issuecomment-210603605

+0

나는에 모델을 통과 할 때조차이 문제를보고 있어요 보기. 질문의 두 번째 예를 참조하십시오. 'ModelState.Clear()'는 이것을 피하는 지저분한 방법처럼 보입니다. 나는 MVC 5가 그런 것을 요구한다고 생각하지 않는다. –

+1

아니, 그렇게하는 방법입니다. MVC5에서도 마찬가지입니다. 공식 회원 (Eilon)이이 https://github.com/aspnet/Mvc/issues/4486#issuecomment-210603605를 확인한 링크를 참조하십시오. – Shyju

2

귀하의 관찰을 확인할 수 있습니다. 당신의 마음을 아프게하는 것은 다음과 같습니다.

[HttpPost] 
public IActionResult Foo (MyModel m) 
{ 
    m.MyProperty = "changed"; 
    var result = new MyModel { MyProperty = "changed" }; 
    return View(result); 
} 

... 같은 결과가 나타납니다.

난 당신이 버그를 기록해야한다고 생각 : https://github.com/aspnet/mvc/issues


편집 : 지금 자신을 이전의 만남에서이 문제를 기억하고 반드시 버그가 아니라 의도하지 않은 결과 아니라고 인정. 이 코드를 실행 한 결과의 이유는 분명하지 않습니다. 이것에 대한 경고를 표출하는 것은 사소한 방법 일 가능성이 없지만 PRG는 따라야 할 좋은 패턴입니다.

+1

OK, 나는 여기에 문제를 제출 : https://github.com/aspnet/Mvc/issues/5315 –

관련 문제