2013-07-08 14 views
0

내 ASP.NET 사이트의 특정 부분에 문제가 있습니다. 이 페이지는 기본적으로 사용자가 인보이스를 편집 한 다음 변경 사항을 게시하는 곳입니다.POST를 통한 모델 전달

이 시점에서 나는 현재 작동중인 페이지를 다시 작성하고 있습니다.

public ActionResult EditInvoice() 
{ 
    SalesDocument invoice = null; 

    try 
    { 
     invoice = SomeService.GetTheInvoice(); 
    } 
    catch (Exception ex) 
    { 
     return HandleControllerException(ex); 
    } 

    return View("InvoiceEdit", invoice.LineItems); 
} 

은 "InvoiceEdit"의 모델은보기 목록

입니다 : 다른 하나는

내가 처음 EditInvoice 조치로 이동 MVC 3 나이보다 나는 차이가 다른 무엇인지 알아낼 수 없습니다

지금은보기 좋은로드 및 디스플레이 형태의 모든 문서 개별 항목 : 다음

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<List<MyApp.SalesDocumentLineItem>>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Line Items</legend> 
      <div id="lineItems" class="table"> 
       <div class="row"> 
        <div class="colHButton">X</div> 
        <div class="colH">Item</div> 
        <div class="colHPrice">Price</div> 
        <div class="colHQty">Qty</div> 
       </div> 
       <% foreach (var item in Model.Where(m => m.LineItemType.Id == NexTow.Client.Framework.UnitsService.LineItemTypes.SaleItem || m.LineItemType.Id == NexTow.Client.Framework.UnitsService.LineItemTypes.NonSaleItem)) 
       { %>  
       <div class="row"> 
        <%=Html.Hidden("Model.LineItemNameId", item.LineItemNameId)%> 
        <div class="cellButton"><button onclick="DeleteContainer(event);">X</button></div> 
        <div class="cell"><span class="formData"><%=item.LineItemDescription %></span></div>     
        <div class="cellPrice"> 
         <span class="formData">$</span> 
         <%= Html.TextBox("Model.Price", item.Price, new { style="width:75px;" })%> 
        </div> 
        <div class="cellQty"> 
         <%= Html.TextBox("Model.Quantity", item.Quantity, new { style = "width:60px;" })%> 
        </div> 
       </div> 
      <%} %> 
     </div> 
    </fieldset> 
    <p> 
     <input type="submit" value="Update Invoice" onclick="SequenceFormElementsNames('salesItems');" /> 
    </p> 

    <% } %> 
</asp:Content> 
이 다음 사용자에게 항목을 편집 할 수있는 기능을 제공합니다

, 사용자 "송장 업데이트"제출 버튼을 클릭하십시오. 게시물을 사용하여 동일한 관점과 행동이 게시물 :

[HttpPost] 
public ActionResult EditInvoice(List<SalesDocumentLineItem> salesItems) 
{ 
    if (salesItems == null || salesItems.Count == 0) 
    { 
     return View("ClientError", new ErrorModel() { Description = "Line items required." }); 
    } 

    SalesDocument invoice = null; 

    try 
    { 
     invoice = SomeService.UpdateInvoice(); 
    } 
    catch (Exception ex) 
    { 
     return HandleControllerException(ex); 
    } 

    InvoiceModel model = new InvoiceModel(); 
    model.Document = invoice; 

    return View("InvoicePreview", model); 
} 

그러나, 바로 그겁니다이 이전 응용 프로그램에서 일했다. 새로운 기능에서는이 기능이 작동하지 않습니다. 최종 EditInvoice POST 액션 메서드에서 중단 점을 지정하면 salesItems 컬렉션이 NULL이됩니다. 무슨 일이야!?

+0

봐. 그들은 꽤 벗어날 것 같습니다. 필자는 MVC 폼 포스트가 foreach 대신에 for 루프로 끝나고 입력 필드에 Html.TextBoxFor (x => x [i] .Price)로 끝나는 것을 보았습니다. 필드에 고유 한 이름을 부여하고 컬렉션을 올바르게 게시합니다. 당신의 모범을 보일 수있는 방법이 있는지 나는 모른다. –

답변

2

Html.TextBox(string, object)을 사용하면 첫 번째 인수가 양식 필드의 이름으로 사용됩니다. 이 양식을 다시 서버에 게시하면 MVC는 조치 메소드의 인수 목록을보고 양식 필드의 이름을 사용하여 해당 인수를 시도하고 빌드합니다. 귀하의 경우에는 List<SalesDocumentLineItem>을 구축하려고 시도합니다.

"Model.Something"을 양식 필드의 이름으로 사용하는 것 같습니다. 이것은 아마도 과거에는 효과가 있었지만, MVC4에서 뭔가 바뀌었을 것으로 추측하고 있습니다. 프레임 워크가 여러분이 더 이상 무엇을 말하고 있는지 알지 못합니다. 다행히도 더 좋은 방법이 있습니다.

대신 문자열을 사용하여 양식 필드의 이름을 설정하는이 같은 강력한 형식의 HTML 헬퍼를 사용

<% for (var i = 0; i < Model.Count; i++) { %> 
    <div class="row"> 
    <%= Html.HiddenFor(model => model[i].LineItemNameId) %> 
    <!-- etc... --> 
    </div> 
<% } %> 

를 HTML 헬퍼의 이러한 버전이를 가리 키도록 람다 식를 사용 속성을 사용하여 "해당 속성을 볼 수 있습니까? 바로 그 속성을 참조하십시오. 적절한 양식 필드 이름을 생성하십시오." (보너스 : 표현식이 어쨌든 속성을 가리키고 있기 때문에 더 이상 값을 지정할 필요가 없습니다. MVC는 표현식이 나타내는 속성 값을 사용합니다)

람다 식은 C# 코드이므로, 오타를 만들면 컴파일 타임 오류가 발생하고 속성 이름을 변경하면 Visual Studio의 "이름 바꾸기"기능과 같은 도구가 작동합니다.

(This answer이 작동 정확히 방법에 대한 자세한 내용이수록.) 당신의 HTML에서 생성받을 양식 요소의`name` 속성에서

+0

이 문제는 즉시 해결되었습니다. HTML 도우미를 "해당"등가로 변경하자마자 작동했습니다. MVC4에는 무언가가있을 것입니다. 나는 무시하고있었습니다. 당신의 도움에 감사드립니다! – user1104203