2009-03-05 10 views
5

Sto utilizzando RC1 di ASP.NET MVC.Raccoglitore modello predefinito e tipi complessi che includono un elenco

Sto cercando di estendere l'esempio di associazione modello Phil Haack's. Sto cercando di utilizzare il legante modello predefinito di impegnare la seguente oggetto:

public class ListOfProducts 
{ 
    public int Id { get; set; } 
    public string Title{ get; set; } 
    List<Product> Items { get; set; } 
} 

public class Product 
{ 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

Sto utilizzando il codice dall'esempio di Phil, con alcune modifiche:

Controller:

using System.Collections.Generic; 
using System.Web.Mvc; 

namespace TestBinding.Controllers 
{ 
    [HandleError] 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

      return View(); 
     } 

     //Action method on HomeController 
     public ActionResult UpdateProducts(ListOfProducts productlist) 
     { 
      return View(productlist); 
     } 
    } 

    public class Product 
    { 
     public string Name { get; set; } 
     public decimal Price { get; set; } 
    } 

    public class ListOfProducts 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     List<Product> Items { get; set; } 
    } 
} 

View :

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

    <asp:Content ID="indexHead" ContentPlaceHolderID="head" runat="server"> 
     <title>Home Page</title> 
    </asp:Content> 

    <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
     <form method="post" action="/Home/UpdateProducts"> 
      <input type="text" name="productlist.id" value="99" /> 
      <input type="text" name="productlist.Title" value="SomeTitle" /> 

      <input type="hidden" name="productlist.Index" value="0" /> 
      <input type="text" name="productlist.items[0].Name" value="Beer" /> 
      <input type="text" name="productlist.items[0].Price" value="7.32" /> 

      <input type="hidden" name="productlist.Index" value="1" /> 
      <input type="text" name="productlist.Items[1].Name" value="Chips" /> 
      <input type="text" name="productlist.Items[1].Price" value="2.23" /> 

      <input type="hidden" name="productlist.Index" value="2" /> 
      <input type="text" name="productlist.Items[2].Name" value="Salsa" /> 
      <input type="text" name="productlist.Items[2].Price" value="1.23" /> 

      <input type="submit" /> 
     </form> 
    </asp:Content> 

il mio problema è che i tipi semplici (Id e titolo) appare nel obje Lista prodotti ct, ma non la lista. Quindi:

  • Il mio codice è sbagliato (non sarebbe sorpreso)?
  • Il raccoglitore modello predefinito può gestire gli oggetti ListOfProducts?
  • Se il raccoglitore modello predefinito non gestirà questo tipo di oggetto cosa devo fare (esempi se possibile)?

Grazie in anticipo.

risposta

6

Per rispondere alla mia domanda:

Sono un manichino!

Il mio esempio non funziona perché la proprietà Items della classe ListOfProducts non è pubblico:

public class ListOfProducts 
{ 
    public int Id { get; set; } 
    public string Title{ get; set; } 
    List<Product> Items { get; set; } 
} 

ho cambiato:

List<Product> Items { get; set; } 

a:

public List<Product> Items { get; set; } 

e la mia il codice allora funzionava.

Per concludere il modello predefinito, binder funziona con tipi che contengono proprietà di tipo List.

+3

Non sei un manichino. Stavo avendo lo stesso problema, ma era perché la mia lista non era una proprietà.Avevo qualcosa di analogo a: Elenco pubblico Elementi, anziché Elenco pubblico Elementi {get; impostato; } –

4

Partendo RC 1:

  • Indice Hidden non è più necessario
  • Il numero in [] deve iniziare con 0 e must salire.

La numerazione è corretta.

Inoltre, ho notato che è stato utilizzato un diverso alloggiamento sul nome della proprietà degli articoli. Questo non dovrebbe fare la differenza, ma vale la pena controllare.

+1

Ciao Craig, grazie per i suggerimenti, molto apprezzato. –

+1

+1 mi ha salvato la giornata – alexandrul

Problemi correlati