Che*_*hev 8 c# asp.net-mvc model-binding razor asp.net-mvc-3
我有一个名为的实体Domain.Models.BlogPost,它包含以下属性:
我还有一个名为的实体Domain.Models.PostComment,它包含以下属性:
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")
Run Code Online (Sandbox Code Playgroud)
问题是,因为注释表单使用@Html.TextBox("Author")和@Html.TextBox("Body"),它们填充了模型中的数据,其中还包含属性Author和Body.有关如何解决此问题的任何建议,以便这些字段在页面加载时不会将值放入其中?
我也尝试创建一个BlogPostViewModel并将其设置为视图模型并BlogPost使用我的实际模型分配属性:
public class BlogPostViewModel
{
public BlogPost BlogPost { get; set; }
public PostComment NewComment { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我做了@Html.TextBoxFor(x => x.NewComment.Author)但是当表单发布到这个动作方法时:
public ActionResult AddComment(PostComment postComment)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
postComment 没有绑定到表单值:/
您可以将该AddComment部分中的字段重命名为不与模型中指定的属性发生冲突的字段,或者您可以使用不同的重载覆盖视图中的值.Html.TextBox 此重载TextBox需要value:
value(Type:System.Object)
文本输入元素的值.如果此值为null,则从ViewDataDictionary对象中检索元素的值.如果那里不存在值,则从ModelStateDictionary对象中检索该值.
更新:由于您添加了"NewComment"作为属性并以这种方式解决了属性命名冲突,所以您需要做的就是将PostComment而不是POST上的整个视图模型绑定到操作,是指示模型绑定器将使用前缀.这是使用BindAttribute.
public ActionResult AddComment([Bind(Prefix = "NewComment")] PostComment postComment)
Run Code Online (Sandbox Code Playgroud)