ASP.NET MVC 3 Modèle de liaison et de champs de formulaire
J'ai une entité appelée Domain.Models.BlogPost
qui contient les propriétés suivantes:
- PostID
- Titre
- Auteur
- PostedDate
- Corps
J'ai aussi une entité appelée Domain.Models.PostComment
qui contient les propriétés suivantes:
- CommentID
- PostID
- Auteur
- Site
- Corps
BlogPost
contient de nombreux PostComments
. Un "un à plusieurs" de la relation.
Maintenant, j'ai une vue comme (séparés formulaire de commentaires de blog code via commentaire html):
@model Domain.Models.BlogPost
@using Domain.Models;
@{
ViewBag.Title = "Post";
}
<div class="postTitle">@Model.Title</div>
<div class="subInfo">
Posted by @Model.Author on @Model.PostedDate.ToString("D")
</div>
<div class="postBody">
@Html.Markdown(Model.Body)
</div>
<br />
@Model.PostComments.Count Comment(s).
<div class="comments">
@foreach (PostComment postComment in Model.PostComments)
{
Html.RenderPartial("PostComment", postComment);
}
</div>
<!-- BELOW IS THE ADD COMMENT FORM -->
<div id="addComment">
@using (Html.BeginForm("AddComment", "Blog"))
{
<text>
@Html.Hidden("PostID", Model.PostID)<br />
Name: @Html.TextBox("Author")<br />
Email: @Html.TextBox("Email")<br />
Website: @Html.TextBox("Website")<br />
Body: @Html.TextArea("Body")<br />
<input type="submit" value = "Add Comment" />
</text>
}
</div>
@Html.ActionLink("Add Comment", "AddComment")
Le problème est que parce que le formulaire de commentaire utilise @Html.TextBox("Author")
et @Html.TextBox("Body")
, ils sont remplis avec les données du modèle, qui contient également des propriétés Author
et Body
. Toutes les suggestions sur la façon de résoudre ce problème de manière que ces champs ne pas obtenir les valeurs à mettre en eux lorsque le chargement de la page?
J'ai aussi essayé de créer un BlogPostViewModel
et en le définissant comme le modèle de la vue et de l'affectation de la BlogPost
bien avec mon modèle réel:
public class BlogPostViewModel
{
public BlogPost BlogPost { get; set; }
public PostComment NewComment { get; set; }
}
Alors je n'ai @Html.TextBoxFor(x => x.NewComment.Author)
mais lorsque le formulaire est affiché pour cette méthode d'action:
public ActionResult AddComment(PostComment postComment)
{
//...
}
postComment
ne se lie pas à la forme de valeurs :/
J'aimerais entendre une meilleure approche également.
Vu votre mise à jour, essayez de liaison basé sur la NewComment préfixe. c'est à dire mettre [Bind(Préfixe = "NewComment")] avant que le paramètre PostComment postComment
Je vais essayer cela et vous laisser savoir comment ça se passe.
L'attribut 'Bind' n'est pas valide sur ce type de déclaration. Il est valable uniquement sur la classe, les param' déclarations. <-- qui s'est passé après que j'ai mis votre attribut sur ma méthode d'action
public ActionResult AddComment(PostComment postComment)
OriginalL'auteur Chev | 2011-03-17
Vous devez vous connecter pour publier un commentaire.
Vous pourriez renommer les champs de la
AddComment
section pour quelque chose qui n'entrent pas en conflit avec les propriétés nommées dans le Modèle, ou vous pouvez remplacer la valeur dans la vue en utilisant une autre surcharge deHtml.TextBox
Cette surcharge dezone de texte
est unvalue
:Mise à JOUR: Depuis que vous avez ajouté "NewComment" en tant que propriété et résolu la propriété de nommage de collision de cette façon, tout ce que vous devez faire pour lier un PostComment plutôt que l'ensemble du modèle de vue sur le POST de l'action, est de charger le modèle de classeur qu'un préfixe qui sera utilisé. Ceci est fait en utilisant la
BindAttribute
.string.Empty
donc je suppose que c'est ce que je vais faire. J'ai juste pensé qu'il devait y avoir une meilleure façon de structurer les modèles/la vue, de sorte que ces collisions ne sont même pas se produire.Vous pourriez structure d'une manière différente, pour éviter la collision. @Jakub Konecki est sur la bonne voie. Ajouter un PostComment propriété nommée "NewComment" à l'article sur le Blog de la classe du modèle. Puis votre code devrait ressembler @Html.TextBoxFor(x => x.NewComment.Corps);
droit que puis-je accepter le modèle de vue en tant que paramètre dans le
AddComment
méthode d'action, au lieu d'accepter une simplePostComment
objet. Comme mentionné dans la question, j'ai essayé une fois déjà.L'amour de la mise à jour. Résolu tous mes problèmes sans fromage valeur primordiale. Merci!!!!
OriginalL'auteur Adam Price
Utilisation ASP NET MVC modèles de sorte que vous avez le plein contrôle sur ce qui se rempli et il est de type sécurisé.
Donc vous créer un
.ascx
modèle qui prend fortement typéComment
. Dans votre modèle, vous laissez un vide.AddComment
méthode d'action à l'accepterBlogPostViewModel
en tant que paramètre au lieu de seulement unPostComment
? Qui me semble bizarre affichage d'une vue de l'objet du modèle avec toutes les propriétés, sauf celui que je suis après. Peut-être que je me trompe et que c'est tout à fait normal.Pas de. Vous voulez passer
Model.EditorFor(m => m.Comment)
Dans la vue oui, mais la méthode d'action, faudrait accepter un modèle de vue de l'objet, pas un
PostComment
objet de droit? Je suis en essais pour vérifier.Oui, il sera. Vous ne voulez pas envoyer l'ensemble de l'objet de retour...
Yep, juste vérifié. Parce que
NewComment
est une propriété deBlogPostViewModel
j'aurais besoin d'accepterBlogPostViewModel
que l'argument de laAddComment
méthode d'action au lieu de la plus succincte paramètre de simplePostComment
.OriginalL'auteur Aliostad
N'est-ce pas là une surcharge sur
TextBox
qui prend une valeur? Vous pouvez simplement passerstring.Empty
...Mais je crois qu'il veut que la valeur de l'utilisateur. L'utilisateur de la valeur assommé par le modèle de classeur par défaut après le POST se produit.
Je pense que c'est une bonne façon - vous voulez rendre un formulaire vide. Vous pouvez lier à un vide instance de PostComment....
Tant pis, j'ai lu la question tout à fait tort. M'ignorer 🙂
non, le POST est très bien. Si l'utilisateur efface les valeurs existantes tombé dans le modèle de classeur et des postes le formulaire, les valeurs correctement soumettre. C'est juste ennuyeux que les champs de formulaire sont pré-chargés avec des valeurs de l'
BlogPost
modèle, même s'ils sont destinés à être videPostComment
champs.OriginalL'auteur Jakub Konecki