2016-12-29 1 views
1

J'ai deux classes et la première contient une liste. La vue reçoit une liste en tant que modèle. Lorsque je poste la vue, je suis en mesure de récupérer dans le contrôleur chaque propriété simple. Mais la liste <> est toujours nulle pour les sous-modèles.Liste de liaison DotNet MVC des listes de confinement d'objets complexes

Les deux classes:

public class MyModel 
{ 
    public int ModelId {get;set;} 
    public string Description {get;set;} 
    public List<SubModel> SubModels {get;set;} 
} 

public class SubModel 
{ 
    public int MySubModelId {get;set;} 
    public string Description {get;set;} 
} 

Dans la page vue, le modèle reçu est

@model List<MyModel> 

Après des recommandations sur Internet, je créé un éditeur de editorfor pour rendre ma classe dans la vue:

@model MyModel 
<tr id="@Model.ModelId"> 
    @Html.HiddenFor(m => m.ModelId) 
    @Html.HiddenFor(m => m.Description) 

    <td>@Model.Description</td> 
</tr> 

@for(int i = 0; i < Model.SubModels.Count; i++) 
{ 
    // How to render the class here to be able to be post in the controller? 
    // @Html.HiddenFor(m => m.SubModels[i]) will not work of course... 
} 
+0

S'il vous plaît nous montrer votre contrôleur et tout autre code dans le pipeline de cette demande. –

+0

Sans voir le contrôleur, c'est difficile à dire. Mais je crois que vous ne pouvez pas renvoyer des types complexes dans un contrôleur, car cela entraînera généralement une valeur nulle. Cela est dû au fait que la chaîne de requête peut être trop longue parmi d'autres raisons. –

Répondre

0

Malheureusement, HiddenFor n'agit pas récursivement, mais y ous pouvez le faire manuellement:

@for (int i = 0; i < Model.SubModels.Count; i++) 
{ 
    // postback everything 
    @Html.HiddenFor(m => m.SubModels[i].MySubModelId) 
    @Html.HiddenFor(m => m.SubModels[i].Description) 
} 

affichage juste retour MySubModelId pour chaque sous-modèle serait suffisant pour empêcher Model.SubModels d'être nulle.

Habituellement, je ne fais que poster les identifiants, en rechargeant tout le reste dans la méthode d'action.

+0

Le problème est que j'ai besoin d'informations provenant de ce sous-modèle qui sera modifié par l'utilisateur. Donc, je ne peux pas simplement enregistrer les ID :( – Eagle

+0

Pour les champs modifiables, utilisez EditorFor ou TextBoxFor au lieu de HiddenFor - essentiellement tout ce qui génère un élément en entrée. – buffjape

0

De la même façon que vous avez masqué l'ID du modèle principal, vous devez également masquer l'ID de chacun des sous-modèles. Sinon, il n'y a aucun moyen pour le programme de les suivre. Inclure le champ caché dans la boucle for pour couvrir chaque sous-modèle.

@Html.HiddenFor(m => m.SubModels[i].MySubModelId) 

(Si cela ne résout pas, le problème est plus probable dans votre contrôleur et vous devez poster que Hash d'autres possibilités.)

0

La réponse est: créer un modèle pour chaque EditorFor propriétés d'une classe qui contient la liste <> pour pouvoir l'entrer dans le contrôleur.

Merci à tous pour votre aide car certains d'entre vous m'ont donné des idées.