ASP.NET MVC 3 Привязка модели и поля формы - PullRequest
8 голосов
/ 17 марта 2011

У меня есть объект с именем Domain.Models.BlogPost, который содержит следующие свойства:

  • PostID
  • Заголовок
  • Автор
  • PostedDate
  • Body

У меня также есть объект с именем Domain.Models.PostComment, который содержит следующие свойства:

  • CommentID
  • PostID
  • Автор
  • Электронная почта
  • Веб-сайт
  • Тело

BlogPost содержит много PostComments.Отношение один ко многим.

Теперь у меня есть такое представление (отдельная форма комментария от кода сообщения блога через 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")

Проблема в том, что форма комментария использует@Html.TextBox("Author") и @Html.TextBox("Body"), они заполняются данными из модели, которая также содержит свойства Author и Body.Любые предложения о том, как это исправить, чтобы в эти поля не помещались значения при загрузке страницы?

Я также пытался создать BlogPostViewModel и установить его в качестве модели представления и назначить BlogPost свойство с моей фактической моделью:

public class BlogPostViewModel
{
    public BlogPost BlogPost { get; set; }
    public PostComment NewComment { get; set; }
}

Тогда я сделал @Html.TextBoxFor(x => x.NewComment.Author), но когда форма отправлена ​​для этого метода действия:

public ActionResult AddComment(PostComment postComment)
{
    // ...
}

postComment не привязывался кзначения формы: /

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

Вы можете переименовать поля в разделе AddComment во что-то, что не вступает в противоречие со свойствами, указанными в модели, или переопределить значение в представлении, используя другую перегрузку Html.TextBox . Перегрузка TextBox занимает value:

значение (Тип: System.Object)
Значение элемента ввода текста. Если это значение равно нулю, значение элемента извлекается из объекта ViewDataDictionary. Если там нет никакого значения, оно извлекается из объекта ModelStateDictionary.


ОБНОВЛЕНИЕ: Поскольку вы добавили «NewComment» в качестве свойства и разрешили коллизию именования свойств таким образом, все, что вам нужно сделать, чтобы привязать PostComment, а не всю модель представления в POST к действию, - это инструктировать модель связыватель, что будет использоваться префикс. Это делается с помощью BindAttribute.

public ActionResult AddComment([Bind(Prefix = "NewComment")] PostComment postComment)
1 голос
/ 17 марта 2011

Используйте шаблоны ASP NET MVC, чтобы иметь полный контроль над тем, что заполняется, и это безопасно для типов.

Таким образом, вы бы создали шаблон .ascx, который принимает строго типизированный Comment.В вашей модели вы оставляете там пустую.

0 голосов
/ 17 марта 2011

Нет ли перегрузки на TextBox, которая принимает значение?Вы могли бы просто передать string.Empty ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...