2010-03-16 5 views
2
public Edit(int? id){ /* Codes */ } 

[HttpPost] 
public Edit(Item model){ /* Codes */ } 

첫 번째 Edit 메서드에서 ItemID 값을 포함하는 Item 복사본을 검색합니다. 그러나 HttpPost 메서드가되면 id 값이 손실됩니다.ASP.NET MVC 편집시 mdoel의 ID 값 유지

public Edit(int? ItemID){ /* Codes */ } 

[HttpPost] 
public Edit(Item model){ /* Codes */ } 

에 항목 ID는 항목 모델에서 지속 할 수있는이 방법을 전환 한 경우. 그러나 이것을 처리하는 좋은 방법입니까? ASP.NET MVC는 Item에 "ItemID"를 연결해야한다는 것을 항상 알 수 있습니까? ID 값을 유지하는 다른 방법이 있습니까? 감사.

+0

를 참조하십시오. –

답변

1

HttpPost 처리시 ID를 잃는 방법을 이해할 수 없습니다. 바인더를 확인하고 직접 쓰는게 좋을까요? 제 경험상 기본 바인더는 약간 성가신 일입니다. 가장 좋은 솔루션 인 척하지는 않지만 here부터 시작할 수 있습니다. 많은 바인더를 손으로 작성해야하는 경우에 선언적 방식으로 변환을 수행하는 데 도움이되는 도구를 살펴보십시오 (예 : AutoMapper).

1

id를 매개 변수로 Post 작업에 추가하려고 시도 했습니까?

public Edit(int? id){ /* Codes */ } 

[HttpPost] 
public Edit(int id, Item model){ /* Codes */ } 

이렇게하면 양식이 게시 될 때 URL에서 해당 ID가 채워집니다.

+0

이 경우 항목 모델 매개 변수가 약간 이상합니다. –

+0

전혀 아닙니다. 이것은 ID를 얻는 매우 합법적 인 방법입니다. 이미 ID가 포함 된 URL로 이동한다는 사실을 고려해 볼 때 ID로 다시 게시하지 않으시겠습니까? –

+0

이것이 내가하는 방법이다. ID를 쉽게 변경할 수 있기 때문에 ID에 대한 사용 권한을 확인하십시오. 이는 모든 메소드에 대해 수행되며,이 메소드에만 해당되는 것은 아닙니다. – Charlino

0

Phil Haack에는 내가하는 일과 관련이 있거나 다를 수있는 소식이 있습니다.

또한 양식 (숨겨진 필드 또는 기타 등등)의 일부로 ID를 클라이언트에 보내지 않고 POST URL의 일부가 아닌 경우 사용자가 POST시 ID 필드가 올바르게 채워지도록하십시오.

1

Item 모델의 자산은 ItemID입니까? 그렇다면 ID이라는 필드를 지나가는 경우 기본 모델 바인더에 채워지지 않습니다. 매개 변수 이름이 Item 속성 이름과 일치하도록 메서드 서명을 변경하면 예상대로 작동합니다.

0

ID 문제를 해결하는 MVC 2 가지 방법은 Optional URL Parameters입니다.

는 MVC 1에 아직도 경우 메소드 인수에 바인딩 속성을 사용

[HttpPost] 
public ActionResult Edit([Bind(Exclude = "ItemID")] Item model) 
{ 
    // ... 
} 
0

조금 늦게 대답하지만 면도기를 사용하는 경우의 일반적인 이드를 결합하기 위해 숨겨진 필드를 사용하는 모델.

 @Html.HiddenFor(model => model.Id) 

완전한 형태의 게시물과 같을 수 있습니다 : 제출 양식에서 데이터를 두 번째 편집 방법에 객체를 모델링하기 위해 올바르게 매핑하는 경우

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Address</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.Id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.StreetLine1, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.StreetLine1, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.StreetLine1, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
}