2009-05-15 3 views
2

私は何をしようとしているかを示す記事やブログ記事を見てきました。しかし、私はそれがうまくいけば誰かがそれが動作するかどうかを確認したり、私が間違っていることを教えてくれるように働くことができませんでした。リスト<T>を含む複雑なモデルオブジェクトでASP.NET MVC UpdateModel()を使用できますか?

バインドしようとしている「複雑な」モデル(InvoiceItemのリストを含む請求書)があり、リストオブジェクトの特定の属性と特定のアイテム/インデックスのみを更新したいと思います。私は主に、リストデータのインクルード/除外が機能するかどうかで問題が発生すると考えています。私が持っている

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 

:私は、次のモデルを持っている...私のコードのすべては以下の通りです

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 

を:私はそうのように、そのincludePropertiesでのUpdateModel()を使用しようとしています以下の表示:

<%@ 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]属性を追加することもできます。

関連する問題