ASP.NET MVC 3模型绑定和表单字段

时间:2011-03-17 16:16:38

标签: c# asp.net-mvc asp.net-mvc-3 razor model-binding

我有一个名为Domain.Models.BlogPost的实体,其中包含以下属性:

  • 帖子ID
  • 标题
  • 作者
  • PostedDate

我还有一个名为Domain.Models.PostComment的实体,它包含以下属性:

  • CommentID
  • 帖子ID
  • 作者
  • 电子邮件
  • 网站

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"),因此会使用模型中的数据填充这些数据,其中还包含属性AuthorBody。有关如何解决此问题的任何建议,以便这些字段在页面加载时不会将值放入其中?

我还尝试创建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 个答案:

答案 0 :(得分:6)

您可以将AddComment部分中的字段重命名为不与模型中指定的属性发生冲突的字段,也可以使用Html.TextBox的不同重载覆盖视图中的值This overload of TextBox takes a value

  

value(Type:System.Object)
      文本输入元素的值。如果此值为null,则从ViewDataDictionary对象中检索元素的值。如果那里不存在值,则从ModelStateDictionary对象中检索该值。


更新:由于您添加了“NewComment”作为属性并以这种方式解决了属性命名冲突,所以您需要做的就是将PostComment而不是POST上的整个视图模型绑定到操作,这是指示模型将使用前缀的活页夹。这是使用BindAttribute完成的。

public ActionResult AddComment([Bind(Prefix = "NewComment")] PostComment postComment)

答案 1 :(得分:1)

使用ASP NET MVC模板,这样您就可以完全控制已填充的内容,并且它是类型安全的。

因此,您需要创建一个.ascx模板,该模板采用强类型Comment。在你的模型中,你留下一个空的。

答案 2 :(得分:0)

TextBox上是否存在超载值?你可以通过string.Empty ...