ASP.NET MVC - Forme Renvoie la valeur Null Modèle, Sauf si le Modèle est Enveloppé dans une Coutume ViewModel
J'ai une paire de points de vue dans mon application qui à la fois d'afficher le même Éditeur de Modèle pour l'un de mes éléments de modèle; l'un des deux points de vue ("Ajouter", "Modifier"), "Modifier" fonctionne très bien, mais "Ajouter" est de retour null pour le modèle lors de mon action de contrôleur gère la poste.
J'ai trouvé que si je donne le "Ajouter" vue personnalisée ViewModel et appel Html.EditorFor(p => p.PageContent)
plutôt que de simplement l'appel de la EditorFor() sur l'ensemble du Modèle objet- Html.EditorFor(p => p)
, puis le formulaire renvoie le bon, la non-null modèle, mais qui génère d'autres problèmes qui ont trait à mon script côté client et contrôle de l'IDs (comme aujourd'hui tous les champs sont préfixés par "PageContent_"). Je suis en utilisant le même Éditeur de Modèle technique à différents endroits tout au long de ma demande et qu'aucune des autres sont en présentant cette étrange dépendance sur un ViewModel.
Quelqu'un d'autre a déjà eu des problèmes similaires?
Modifier La Vue
<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>
<% using (Html.BeginForm())
{ %>
<%=Html.Hidden("PageID", Model.Page.ID) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" name="btnCancel" value="Cancel" class="cancel" />
<% }
Action (De Travail)
[HttpPost, ValidateInput(false)]
public ActionResult EditContent(int id, FormCollection formCollection) {}
Ajouter Une Vue
<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>
<% using (Html.BeginForm())
{ %>
<%=Html.Hidden("PageID", ViewData["PageID"]) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" name="btnCancel" value="Cancel" class="cancel" />
<% } %>
Action (À Défaut)
//content is ALWAYS null
[HttpPost, ValidateInput(false)]
public ActionResult AddContent(PageContent content, FormCollection formCollection) {}
Avant de crier "dupliquer"
Cette question ne se rapportent à l' cette une, mais cette question vise à cibler le problème spécifique que je suis en train de vivre plutôt que de la plus générale à la question posée.
FormCollection
. Il n'est pas nécessaire.Corrigez-moi si je me trompe, mais n'avez-vous pas besoin de le préfixe d'être là pour le classeur de modèles par défaut pour le travail? Ou avez-vous oubliez de définir l'attribut Bind sur un paramètre?
J'utilise le FormCollection pour vérifier un bouton "Annuler" étant un clic ainsi que quelques informations complémentaires qui tombe en dehors du modèle. J'ai été en utilisant la même signature sur à peu près tous les Ajouter/Modifier l'action de ce jour sans fail.
Je n'ai pas trouvé que c'était le cas auparavant car je ne suis pas à l'aide du préfixe sur certains de mes sous d'autres formes de travail sans problème.
Ce ne au contenu de la page? Si vous n'avez pas d'articles correspondants dans votre formulaire, il ne sera pas le modèle se lier à quoi que ce soit.
OriginalL'auteur Nathan Taylor | 2009-11-30
Vous devez vous connecter pour publier un commentaire.
J'ai traqué le problème et c'est plutôt intéressant.
Lorsque le DefaultModelBinder tente de résoudre un élément de modèle de l'une des premières choses qu'il fait est de vérifier pour voir si il y a des préfixé champs de données lié; il le fait par la vérification de tous les éléments de formulaire qui commencent par le nom de l'objet modèle (ce qui semble extrêmement arbitraire, si vous me le demandez). Si un "préfixe" les champs sont trouvé, alors il en résulte différentes liaison logique invoquée.
ASP.NET MVC 2 Extrait 2 BindModel() Source
Le contrôleur de l'action que j'ai défini pour gérer l'Ajout d'une action définit un élément au contenu de la page appelé "contenu" et dans mon domaine au contenu de la page a une propriété appelée "Contenu" qui est "jumelé" avec le nom du modèle de "contenu" de sorte que les DefaultModelBinder à assumer, j'ai eu un préfixe de la valeur, alors qu'en fait c'était tout simplement un membre de la au contenu de la page. Par la modification de la signature-
à partir de:
:
La DefaultModelBinder a encore une fois été en mesure de bien se lier à ma au contenu de la page de l'élément de modèle. Je ne suis pas sûr pourquoi, la vue d'Édition de ne pas afficher ce comportement, mais de toute façon, j'ai retrouvé la source du problème.
Il me semble que cette question tombe très proche de "bug". Il est logique que mon point de vue a d'abord travaillé avec le ViewModel parce que le "contenu" a été d'obtenir avec le préfixe "PageContent_", mais un cadre de base de la fonctionnalité/bug comme cela ne doit pas être négligé à mon humble avis.
Quand vous garantir que nul n'aurait eu, je suis honnête en disant que le scénario est vraiment allé dans ma tête quand j'ai été pour vous demander de publier la composition de la classe au contenu de la page 😉 en tout cas, heureux que vous ayez pensé à elle 🙂
Façon de défier les attentes haha
Je suis d'accord qu'il devrait l'être. Lorsque vous utilisez explicitement fortement typé ViewPage, vous vous attendez à des fixations, fortement typé.
Aucun moyen. Merci pour ce post, gain de temps.
OriginalL'auteur Nathan Taylor