C# ASP.NET MVC 3模型绑定和表单字段
我有一个名为C# ASP.NET MVC 3模型绑定和表单字段,c#,asp.net-mvc,asp.net-mvc-3,razor,model-binding,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,Model Binding,我有一个名为Domain.Models.BlogPost的实体,它包含以下属性: 张贴 头衔 作者 后置 身体 我还有一个名为Domain.Models.PostComment的实体,它包含以下属性: 评论 张贴 作者 电子邮件 网站 身体 BlogPost包含许多post命令。一对多的关系 现在我有了这样一个视图(通过html注释将评论表单与博客帖子代码分开): 然后我做了@Html.TextBoxFor(x=>x.newcommon.Author),但是当表单发布到这个操作方法时:
Domain.Models.BlogPost
的实体,它包含以下属性:
- 张贴
- 头衔
- 作者
- 后置
- 身体
Domain.Models.PostComment
的实体,它包含以下属性:
- 评论
- 张贴
- 作者
- 电子邮件
- 网站
- 身体
BlogPost
包含许多post命令
。一对多的关系
现在我有了这样一个视图(通过html注释将评论表单与博客帖子代码分开):
然后我做了@Html.TextBoxFor(x=>x.newcommon.Author)
,但是当表单发布到这个操作方法时:
public ActionResult AddComment(PostComment postComment)
{
// ...
}
postComment
未绑定到表单值:/文本框上是否存在接受值的重载?您可以只传递string.Empty
..您可以将AddComment
部分中的字段重命名为与模型中命名的属性不冲突的内容,或者您可以使用另一个重载Html.TextBox
覆盖视图中的值:
值(类型:System.Object)文本输入元素的值。如果此值为null,则从ViewDataDictionary对象检索元素的值。如果不存在值,则从ModelStateDictionary对象检索该值
更新:由于您添加了“NewComment”作为属性,并通过这种方式解决了属性命名冲突,因此要将POST命令而不是POST上的整个视图模型绑定到操作,只需指示模型绑定器将使用前缀。这是使用
BindAttribute
完成的
public ActionResult AddComment([Bind(Prefix = "NewComment")] PostComment postComment)
使用ASP NET MVC模板可以完全控制填充的内容,并且是类型安全的
因此,您将创建一个
.ascx
模板,该模板接受强类型的注释。在您的模型中,您会在其中留下一个空的。这是默认模型活页夹的一个丑陋事实。我已经打过几次了。我的最佳解决方案是将[Bind(Exclude=“Author,Body”)]添加到操作中,然后手动修复snafu。我希望听到更好的方法。我也希望听到更好的方法。看到您的更新,请尝试基于新成员前缀的绑定。i、 e.将[Bind(Prefix=“NewComment”)]放在参数PostComment postCommentI之前,我将尝试此操作并让您知道它是如何进行的。属性“Bind”在此声明类型上无效。它仅对“class,param”声明有效。是的,但这似乎有点刻薄。感觉应该有更好的方法。但我相信他想要用户所投入的价值。在POST发生后,用户的值会被默认的模型绑定器破坏。我认为这是一种正确的方法-您希望呈现一个空表单。你可以绑定到一个空的PostComment实例……没关系,我把这个问题读错了。别理我:)@Matt不,这个帖子很好。如果用户删除模型绑定器中的现有值并发布表单,则这些值将正确提交。表单字段预先加载了BlogPost
模型中的值,尽管它们应该是空的PostComment
字段,这让人很恼火。嗯,好吧,这是两个人告诉我将值重写为string.empty
,所以我想这就是我要做的。我只是想有一种更好的方法来构造模型/视图,这样这些冲突就不会发生。你可以用另一种方法来构造它以避免冲突@雅库布·科内基走上了正确的道路。将名为“NewComment”的PostComment属性添加到BlogPost模型类。然后视图代码看起来像@Html.TextBoxFor(x=>x.NewComment.Body);对,但我必须接受视图模型作为AddComment
操作方法中的参数,而不是接受简单的PostComment
对象。正如问题中提到的,我已经试过一次了。喜欢这个更新。解决了我所有的问题,没有任何俗气的价值凌驾。非常感谢。这是否意味着AddComment
操作方法必须接受BlogPostViewModel
作为参数,而不仅仅是PostComment
?发回一个视图模型对象时,除了我要找的那个对象之外,所有属性都是空的,这看起来很奇怪。也许我错了,这很正常,不。您将在视图中传递Model.EditorFor(m=>m.Comment)
是,但操作方法需要接受视图模型对象,而不是PostComment
对象,对吗?我现在正在测试以验证。是的,刚刚检查过。因为NewComment
是BlogPostViewModel
的属性,我需要接受BlogPostViewModel
作为AddComment
操作方法的参数,而不是简单的PostComment
的更简洁的参数。检查此屏幕截图,您会注意到表单值前面有NewComment.Property
而不是视图模型对象的一部分,它们只是Property
<除非我接受视图模型对象本身作为参数,否则code>NewComment.Property
会导致它不绑定。
public ActionResult AddComment(PostComment postComment)
{
// ...
}
public ActionResult AddComment([Bind(Prefix = "NewComment")] PostComment postComment)