1

Ma question aujourd'hui est de savoir comment gérer les vues partielles dynamiques imbriquées complexes dans les applications MVC 5. L'idée est qu'un client peut ajouter x nombre de magasins et x nombre de taxes de magasin par paiement.Problèmes de liaison de modèles à l'aide de la vue partielle imbriquée dynamique

La meilleure façon de décrire ma situation est la structure de mes modèles:

public class PaymentViewModel 
{ 
    public HomeViewModel 
    { 
     NewStores = new List<StoreViewModel>(); 
    } 
    public IList<StoreViewModel> NewStores { get; set; } 
} 

public class StoreViewModel 
{ 
    public StoreViewModel 
    { 
     NewStoreTax = new List<StoreTaxViewModel>(); 
    } 
    public IList<StoreTaxViewModel> NewStoreTaxes { get; set; } 
} 

public class StoreTaxViewModel 
{ 
    public int TaxId { get; set; }; 
    public string TaxName { get; set; }; 
    public decimal TaxRate { get; set; }; 
} 

La vue Index.cshtml contient la forme suivante:

@model PaymentViewModel 
@using (Html.BeginForm()) 
{ 
    <div id="newStores"> 
    @for (int i = 0; i < @Model.NewStores.Count(); i++) 
    { 
    @Html.EditorFor(model => @Model.NewStores[i]) 
    } 
    <div /> 

    <input type="button" id="addstore" name="addstore" value="Add Store" /> 
    <input type="submit" id="submit" name="submit" value="Save" /> 
} 

Le modèle de l'éditeur pour Store.cshtml :

@model StoreViewModel 
@using (Html.BeginCollectionItem("NewStores")) 
{ 
    <div id="newStoreTax"> 
    @for (int i = 0; i < @Model.NewStoreTaxes.Count; i++) 
    { 
     @Html.EditorFor(model => @Model.NewStoreTaxes[i]) 
    } 
    </div> 

    <input type="button" id="addstoretax" name="addstoretax" value="Add Store Tax" /> 
} 

Enfin, le modèle de l'éditeur pour StoreTax.cshtml:Chaque fois que je poste sur le contrôleur et que j'inspecte le modèle, la liste des objets Magasin a été remplie, mais les listes d'objets StoreTaxes à l'intérieur de l'objet Store ne le sont pas.

je l'action POST suivante dans mon contrôleur:

[HttpPost] 
public ActionResult Index(PaymentViewModel paymentViewModel) 
{ 

} 

public ActionResult CreateNewStore() 
{ 
    var storeViewModel = new StoreViewModel(); 
    return PartialView("~/Views/Shared/EditorTemplates/StoreViewModel.cshtml", storeViewModel); 
} 

public ActionResult CreateNewStoreTax() 
{ 
    var storeTaxViewModel = new StoreTaxViewModel(); 
    return PartialView("~/Views/Shared/EditorTemplates/StoreTaxViewModel.cshtml", storeTaxViewModel); 
} 

Comment puis-je structurer ma demande pour traiter de tels modèles dynamiques complexes de nidification?

Merci d'avance!

+0

Avez-vous réussi à résoudre ce problème? Je suis actuellement en train de rencontrer un problème similaire. – prismeyez83

Répondre

0

l'intérieur de votre modèle de l'éditeur que vous faites ce qui suit:

@Html.EditorFor(model => @Model.taxName) 

Alors que vous devriez accomplirez:

@Html.EditorFor(model => model.taxName) 

En outre, FWIW, vous n'avez pas besoin de parcourir la articles un appel @Html.EditorFor(model => @Model.NewStores[i]) pour chaque. Faites simplement:

@Html.EditorFor(model => model.NewStores) 

Razor rendra automatiquement le modèle d'éditeur pour chaque élément de la collection.

+0

Merci Chris! J'ai ajouté votre suggestion et aucun changement. Les listes d'objets StoreTaxes dans l'objet Store ne sont toujours pas renseignées. – Paul