2009-03-05 2 views
5

J'utilise RC1 de ASP.NET MVC.liant modèle par défaut et types complexes qui incluent une liste

Je suis en train d'étendre Phil Haack's exemple de liaison de modèle. Je suis en train d'utiliser le modèle de liaison par défaut pour lier l'objet suivant:

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; } 
} 

J'utilise le code de l'exemple de Phil avec quelques modifications:

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; } 
    } 
} 

Voir :

<%@ 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> 

Mon problème est que les types simples (Id et Titre) apparaît dans l'obje de la liste de produits ct, mais pas la liste. Donc:

  • Mon code est mauvais (ne serait pas surpris)?
  • le liant modèle par défaut peut gérer les objets ListOfProducts?
  • Si le classeur de modèle par défaut ne gère pas ce type d'objet, que dois-je faire (exemples si possible)?

Merci d'avance.

Répondre

6

Pour répondre à ma propre question:

Je suis un mannequin!

Mon exemple ne fonctionne pas parce que la propriété Items de la classe ListOfProducts est pas public:

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

Je changé:

List<Product> Items { get; set; } 

à:

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

et mon code a ensuite travaillé.

Pour conclure que le classeur de modèle par défaut fonctionne avec les types qui contiennent des propriétés de type Liste.

+3

Vous n'êtes pas un mannequin. J'avais le même problème, mais c'était parce que ma liste n'était pas une propriété.J'ai eu quelque chose d'analogue à: public Liste Articles, au lieu de public Liste Objets {get; ensemble; } –

4

A partir de RC 1:

  • Index caché n'est plus nécessaire
  • Le nombre [] doit commencer par 0 et doit Ascend.

Votre numérotation semble OK.

De plus, je remarque que vous avez utilisé boîtier différent sur vos objets nom de la propriété. Cela ne devrait pas faire de différence, mais ça vaut le coup de vérifier.

+1

Salut Craig, Merci pour les conseils, très appréciés. –

+1

+1 sauvé ma journée – alexandrul

Questions connexes