2012-12-19 1 views
5

내 시나리오는 다음과 같습니다. 이HTML 확장명을 사용하는 값은 두 모델에 같은 이름의 속성이있는 경우와 다를 수 있습니다.

@model MvcApplication2.Models.SimpleModel1 

@{ 
ViewBag.Title = "Home Page"; 
} 

@using (Html.BeginForm("Test", "Home", FormMethod.Post)) 
{ 
    <label>Enter something here</label> 
    @Html.TextBoxFor(m => m.Property1) 
    <button type="submit">Submit</button> 
} 
  • 처럼 보이는 뷰를 반환하는 일반적인 속성 이름 (예를 들어 지수) 액션에 SimpleModel1을 사용

    public class SimpleModel1 
    { 
    // Some Properties 
    
    public string Property1 { get; set; } 
    
    } 
    
    public class SimpleModel2 
    { 
    // Some Properties 
    
    public string Property1 { get; set; } // Same name as Property1 in SimpleModel1 
    
    } 
    
    1. 만든 두 모델 SimpleModel1을 매개 변수로 사용하는 Test 작업에 값을 제출하고 일부는 작동하며 SimpleModel2에서 취하는보기를 반환합니다

      ,
      public ActionResult Test(SimpleModel1 model) 
      { 
          SimpleModel2 newModel = new SimpleModel2(); 
      
          // Do Something 
      
          newModel.Property1 = "Something different than model's Property1"; 
      
          return View(newModel); 
      } 
      
    2. Test.cshtml은 (보기 테스트 작용에 의해 반환) 다음과 같습니다 :

      @model MvcApplication2.Models.SimpleModel2 
      
      @{ 
          ViewBag.Title = "Test"; 
      } 
      
      <h2>Test</h2> 
      
      @* Model Propery without using HTML extension*@ 
      @Model.Property1 
      
      @* Model property using HTML extension (Incorrect) *@ 
      
      @Html.TextBoxFor(m => m.Property1) 
      @Html.HiddenFor(m => m.Property1) 
      @Html.TextAreaFor(m => m.Property1) 
      
          @* Correct Value *@ 
      <input value="@Model.Property1" /> 
      

    는 내가 기대하는 속성 1의 모든 값이 "모델의 속성 1과는 다른 뭔가가 될 것입니다 "테스트 액션에서 설정합니다. 그러나 Html 확장 (Html.TextBoxFor, Html.HiddenFor 등)을 사용하는 것들은 Test Action에 게시 된 Property1 값을가집니다. 예를 들어, "What a surprise"(SimpleModel1의 Property1)를 Test Action에 게시하면 SimpleModel2의 Property1 값도 내가 설정 한 값과 상관없이 "놀라운 것"입니다.

    나는 무슨 일이 일어나는지 전혀 모른다. 나에게 벌레 같아. 누구 아이디어가 있습니까?

  • 답변

    10

    게시 된 데이터가 ModelState에서 유지되므로 POST 일 때이 동작이 표시됩니다. Property1 값은이 특성에 대해 값이 게시 된 값이됩니다. 당신이 당신의 ActionResult 시험에서이 코드 줄을 포함 할 필요가 새 값을 참조하기 위해 :

    ModelState.Clear(); 
    

    일반적인 규칙은 당신이 데이터를 게시를 수정하고하려고하는 경우에이 라인을 포함하는 기억으로 반환 된 뷰의 수정 된 데이터를 참조하십시오.

    +0

    이 방법이 효과적 이었지만 왜 html 확장 방법에 문제가 있습니까? 어떻게 @ Model.Property1 올바른 값을 보여? –

    +0

    내부 HTML 확장 메서드는 ModelState의 값을보고 속성 값을 결정합니다. 이것은 그들이 쓰여지는 것입니다. 나는 왜 그들이 이렇게 쓰여 있는지 말할 수 없다. 바라건대 다른 누군가가 할 수 있기를 바랍니다. 나는 또한 알고있는 것이 흥미로울 것이다. – Dmitry

    +3

    @Dmitry ViewModel 대신에 여러 매개 변수를 개별적으로 가져 오거나 값을 검색하기 위해 양식 콜렉션을 사용하는 POST 메소드가있는 경우 검증에 실패한 POST에서 식사 구성을 작성할 필요가 없습니다 폼이 ModelState에서 자동으로 채워지기 때문에 새로운 viewmodel을 만들고 폼 요소의 모든 다양한 속성을 설정합니다. 나머지 우리가 POST 매개 변수에서 ViewModel을 사용하면 ModelState가 뷰 모델보다 우선적으로 적용됩니다. – AaronLS

    관련 문제