2009-05-15 3 views
2

내가 뭘하려고하는지 나타내는 기사와 블로그 게시물을 지원해야합니다. 그러나 나는 그것을 잘 작동시키지 못해서 누군가가 그것이 작동하는지/작동하지 않는지, 그리고/또는 내가 무엇을 잘못하고 있는지를 말할 수 있음을 확신 할 수있다.List <T>을 포함하는 복잡한 모델 개체에 ASP.NET MVC UpdateModel()을 사용할 수 있습니까?

바인딩하려고 시도하는 "복잡한"모델 (InvoiceItem 목록을 포함하는 송장)이 있는데 목록 개체의 특정 특성 및 특정 항목/인덱스 만 업데이트하려고합니다. 내 문제는 주로 포함/제외 목록 데이터에 대한 작동 여부를 믿습니다. 그래서 같이 그 includeProperties와 UpdateModel()를 사용하려고 시도하고있다 :

내 모든 코드는 다음과 같습니다
Public Function Edit(ByVal id As String, ByVal values As FormCollection) 
    Dim invoice As Invoice = _getInvoice(id) 
    UpdateModel(invoice, "", New String() {"InvoiceDate", "CustomerName", "Items[0].Price"})   
    'Do some stuff... 
End Function 

...

나는 다음과 같은 모델을 가지고 내가 가진

Public Class Invoice 
    Private _invoiceNumber As String 
    Private _invoiceDate As DateTime 
    Private _customerName As String 
    Private _items As List(Of InvoiceItem) 
    Public Property InvoiceNumber() As String 
     Get 
      Return _invoiceNumber 
     End Get 
     Set(ByVal value As String) 
      _invoiceNumber = value 
     End Set 
    End Property 
    Public Property InvoiceDate() As DateTime 
     Get 
      Return _invoiceDate 
     End Get 
     Set(ByVal value As DateTime) 
      _invoiceDate = value 
     End Set 
    End Property 
    Public Property CustomerName() As String 
     Get 
      Return _customerName 
     End Get 
     Set(ByVal value As String) 
      _customerName = value 
     End Set 
    End Property 
    Public Property Items() As List(Of InvoiceItem) 
     Get 
      Return _items 
     End Get 
     Set(ByVal value As List(Of InvoiceItem)) 
      _items = value 
     End Set 
    End Property 
End Class 

Public Class InvoiceItem 
    Private _itemNumber As Integer 
    Private _description As String 
    Private _price As Decimal 
    Public Property ItemNumber() As Integer 
     Get 
      Return _itemNumber 
     End Get 
     Set(ByVal value As Integer) 
      _itemNumber = value 
     End Set 
    End Property 
    Public Property Description() As String 
     Get 
      Return _description 
     End Get 
     Set(ByVal value As String) 
      _description = value 
     End Set 
    End Property 
    Public Property Price() As Decimal 
     Get 
      Return _price 
     End Get 
     Set(ByVal value As Decimal) 
      _price = value 
     End Set 
    End Property 
End Class 

을 다음보기 : 여기

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage(Of MvcApplication2.Invoice)" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
    <title>Edit</title> 
</asp:Content> 

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

    <h2>Edit</h2> 

    <%=Html.ValidationSummary()%> 

    <% Using Html.BeginForm() %> 

     <fieldset> 
      <legend>Fields</legend> 
      <p> 
       <label for="InvoiceNumber">InvoiceNumber:</label> 
       <%= Html.TextBox("InvoiceNumber") %> 
       <%= Html.ValidationMessage("InvoiceNumber", "*") %> 
      </p> 
      <p> 
       <label for="InvoiceDate">InvoiceDate:</label> 
       <%= Html.TextBox("InvoiceDate") %> 
       <%= Html.ValidationMessage("InvoiceDate", "*") %> 
      </p> 
      <p> 
       <label for="CustomerName">CustomerName:</label> 
       <%= Html.TextBox("CustomerName") %> 
       <%= Html.ValidationMessage("CustomerName", "*") %> 
      </p> 
      <%For x As Integer = 0 To ViewData.Model.Items.Count - 1%>  
      <p>  
       <label for="Item<%=ViewData.Model.Items(x).ItemNumber %>">Item <%=ViewData.Model.Items(x).ItemNumber%>:</label> 
       <%=Html.Hidden("Items.Index", x)%> 
       <%=Html.TextBox(String.Format("Items[{0}].Description", x), ViewData.Model.Items(x).Description)%> 
       <%=Html.ValidationMessage("Description", "*")%> 
       <%=Html.TextBox(String.Format("Items[{0}].Price", x), ViewData.Model.Items(x).Price)%> 
       <%=Html.ValidationMessage("Price", "*")%> 
      </p> 
      <%Next x%> 
      <p> 
       <input type="submit" value="Save" /> 
      </p> 
     </fieldset> 

    <% End Using %> 


</asp:Content> 

그리고 내 컨트롤러입니다 :

Public Class InvoicingController 
    Inherits System.Web.Mvc.Controller 

    Private Function _getInvoice(ByVal id As String) As Invoice 
     Dim invoice As New Invoice 
     invoice.InvoiceNumber = id 
     invoice.CustomerName = "John Doe" 
     invoice.InvoiceDate = DateTime.Now 
     invoice.Items = New List(Of InvoiceItem) 
     For x As Integer = 1 To 5 
      Dim item As InvoiceItem = New InvoiceItem 
      item.ItemNumber = x 
      item.Description = String.Format("Item {0}", x) 
      item.Price = 100 + x 
      invoice.Items.Add(item) 
     Next 
     Return invoice 
    End Function 

    <AcceptVerbs(HttpVerbs.Post)> _ 
    Function Edit(ByVal id As String) As ActionResult 
     Dim invoice As Invoice = _getInvoice(id) 
     Return View(invoice) 
    End Function 



     'UpdateModel(invoice, "", New String() {"InvoiceDate", "CustomerName", "Items"}) 'NOTE: THis line appears to update any InvoiceItem attributes that are supplied 
     UpdateModel(invoice, "", New String() {"InvoiceDate", "CustomerName", "Items[0].Price"}) 'This line does not allow the first item's Price to be updated. 

     Return View() 

    End Function 

End Class 

미리 감사드립니다.

답변

0

viewmodel의 양식에서 MVC가 바인드/업데이트하지 않으려는 필드의 특성을 선언하지 마십시오.

MVC 바인더는 getter/setter를 사용하여 속성 만 바인딩합니다. "읽기 전용"속성을 단순 필드로 선언하면됩니다.

또한이 필드에 [BindNever] 속성을 추가 할 수 있습니다.

관련 문제