Question

J'ai le modèle suivant dans MVC:

public class IndexViewModel
{
    public SubViewModel SubViewModel { get; set; }
}

Dans ma vue d'index, je fais ce qui suit pour afficher un éditeur pour SubViewModel:

Index.cshtml

@model IndexViewModel

@Html.EditorFor(m => m.SubViewModel)

Dans mon SubViewModel.cshtml Fichier J'ai essayé de faire ce qui suit:

EditORemplates / subswewmodel.cshtml

@model SubViewModel

@Html.EditorForModel("SubViewModelForm")

Fondamentalement, je veux me séparer mon éditeur en deux pièces. Le premier modèle d'éditeur créerait le formulaire, et l'intérieur créerait tous les champs de formulaire réels. Le problème est que la vue intérieure n'est jamais rendue.

C'est comme si MVC réalise que j'ai déjà appelé l'éditeur pour ce modèle et m'empêche de le refaire. Existe-t-il un moyen de faire fonctionner cela?

ÉDITER

Je pensais avoir tapé ce qui se passait clairement, mais je suppose que non.

Je souhaite utiliser deux modèles pour afficher un seul modèle. Dans le premier modèle, je souhaite rendre le formulaire et le bouton Soumettre, et quelques div de conteneurs.

Dans le deuxième modèle, je veux rendre tous les champs de forme.

Index.cshtml @ html.editorfor (m => M.SubViewModel) -> Rendez le formulaire et le conteneur

SubViewModel.cshtml @ html.editorformodel ("SubViewModelform") -> Rendez les champs de formulaire

Le problème est que le deuxième appel (@ html.editorformodel ("subViewModelform")) ne semble rien faire. Il ne rend jamais du tout des balises. Il est ignoré par MVC.

La raison pour laquelle je veux le faire de cette façon, c'est parce que je vais publier ce formulaire avec un appel ajax. Si tout va bien (l'état du modèle est valide), je veux renvoyer les données JSON à la vue. Si le modèle n'est pas valide, je souhaite retourner la vue partielle avec les champs de formulaire. De cette façon, je n'ai plus besoin de connecter à nouveau tous mes gestionnaires d'événements. Je peux simplement remplacer les champs de formulaire au lieu de toute la vue.

Était-ce utile?

La solution

Après avoir lu vos détails supplémentaires, je pense qu'il serait préférable d'utiliser un modèle de modèle de conteneur.

/* Container.cshtml (container markup and call to editor template) */
<fieldset>                    
    @Html.EditorForModel()
</fieldset>

/* SubViewModel.cshtml editor template */
@model SubViewModel

@Html.DisplayFor(x => x.Property1)
@Html.EditorFor(x => x.Property1)
...

/* Index.cshtml */
@Html.RenderPartial("Container.cshtml", Model.SubViewModel)

Autres conseils

Je crois que cela a quelque chose à voir avec TemplateInfo.visited méthode. Disant simplement, vous ne pouvez pas utiliser EditorFor deux fois pour le même objet. C'est pourquoi MVC ignore votre deuxième EditorFormodel, en tant que rédacteur en chef de SubViewModel, déjà rendu (à partir d'index.cshtml).

Je ne sais pas si c'est la meilleure solution de contournement, mais la première chose qui vient à l'esprit est de rendre le deuxième modèle comme vue partielle, en appelant Html.Partial

@model SubViewModel

@Html.Partial("SubViewModelForm", Model)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top