ASP.NET MVC - Utilisation de l'éditeur pour le même type de modèle deux fois
-
28-10-2019 - |
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.
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)