내가 뭘하려고하는지 나타내는 기사와 블로그 게시물을 지원해야합니다. 그러나 나는 그것을 잘 작동시키지 못해서 누군가가 그것이 작동하는지/작동하지 않는지, 그리고/또는 내가 무엇을 잘못하고 있는지를 말할 수 있음을 확신 할 수있다.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
미리 감사드립니다.