Question

J'utilise RC1 d'ASP.NET MVC.

J'essaie d'étendre Phil Exemple de liaison de modèle de Haack . J'essaie d'utiliser le classeur de modèle 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:

Contrôleur:

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 Title) apparaissent dans l'objet productlist, mais pas dans la liste. Donc:

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

Merci d'avance.

Était-ce utile?

La solution

Pour répondre à ma propre question:

Je suis un mannequin!

Mon exemple ne fonctionne pas car la propriété Items de la classe ListOfProducts n'est pas publique:

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

j'ai changé:

List<Product> Items { get; set; } 

à:

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

et mon code a ensuite fonctionné.

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

Autres conseils

À partir de la RC 1:

  • L'index masqué n'est plus requis
  • Le nombre entre [] doit commencer par 0 et doit augmenter.

Votre numérotation semble correcte.

De plus, j'ai remarqué que vous utilisiez un boîtier différent pour le nom de la propriété de vos éléments. Cela ne devrait pas faire de différence, mais cela vaut la peine de vérifier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top