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
  • E-mail
  • 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 :/

C'est une dure réalité du modèle de classeur par défaut. J'ai frappé à quelques reprises. Mon meilleur solution a été d'ajouter [Bind(Exclude="Auteur, le Corps")] à l'action, puis de fixer le snafu manuellement. J'aimerais entendre une meilleure approche.
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

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *