Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 3模型绑定和表单字段_C#_Asp.net Mvc_Asp.net Mvc 3_Razor_Model Binding - Fatal编程技术网

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)