Asp.net mvc ASP.NET MVC模型绑定器的问题

Asp.net mvc ASP.NET MVC模型绑定器的问题,asp.net-mvc,Asp.net Mvc,使用此控制器方法:- [AcceptVerbs(HttpVerbs.Post)] public ViewResult Contact(Contact contactMessage) { return View(); } 为什么这样做 public class Contact { public string Name { get; set; } public string Email { get; set; } public

使用此控制器方法:-

    [AcceptVerbs(HttpVerbs.Post)]
    public ViewResult Contact(Contact contactMessage)
    {
        return View();
    }
为什么这样做

public class Contact
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Message { get; set; }
}

<% using(Html.BeginForm()) { %>
<p>Name : <%= Html.TextBox("Name")%></p>
<p>Email : <%= Html.TextBox("Email")%></p>
<p>Message : <%= Html.TextBox("Message")%></p>
<p><input type="submit" value="Send Data" /></p>
公共类联系人
{
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
公共字符串消息{get;set;}
}
姓名:

电邮:

信息:

但这不是吗

public class Contact
{
    public string ContactName { get; set; }
    public string ContactEmail { get; set; }
    public string ContactMessage { get; set; }
}

<p>Name : <%= Html.TextBox("ContactName")%></p>
<p>Email : <%= Html.TextBox("ContactEmail")%></p>
<p>Message : <%= Html.TextBox("ContactMessage")%></p>
<p><input type="submit" value="Send Data" /></p>
公共类联系人
{
公共字符串ContactName{get;set;}
公共字符串ContactEmail{get;set;}
公共字符串ContactMessage{get;set;}
}
姓名:

电邮:

信息:

请不要告诉我字段名只被部分识别

相信我,我所做的只是将文本“Contact”添加到对象中的每个字段和表单中的每个字段。这就好像MVC对所有以相同的前7个字符开头的字段感到困惑一样

有什么好处

有人能解释一下吗


Paul。

是否可能在刷新浏览器时自动重新编译视图,但在更改属性名称后,整个项目尚未重建?

我目前找不到任何合理的解释来解释为什么第二个不起作用。但是,如果您将动作签名更改为如下所示,则它会起作用:

public ViewResult Index([Bind(Prefix="")]Contact contactMessage)
 <%=html.TextBox("Contact.Name")%>
public ViewResult Index([Bind(Prefix="Contact")]Contact contactMessage)
我想这与DefaultModelBinder有关


更新: 好了,这真的很有趣:

// Not working
public ViewResult Index(Contact contactMessage)

// Not working
public ViewResult Index(Contact contactmessage)

// Working
public ViewResult Index(Contact contact)

// Working
public ViewResult Index(Contact contactMsg)

// Working
public ViewResult Index(Contact abc)
真奇怪


更新2:

好的,明白了。您的模型中有一个名为
ContactMessage
的属性,在操作中传递的变量名也被称为
ContactMessage
。这就是歧义的来源。DefaultModelBinder中没有bug。他不能同时绑定到string和Contact类型的属性,大小写为closed:-)


您的非工作示例中缺少


或者。。可能contactMessage参数名称与表单post中的变量号冲突。

对文本框进行如下编码:

public ViewResult Index([Bind(Prefix="")]Contact contactMessage)
 <%=html.TextBox("Contact.Name")%>
public ViewResult Index([Bind(Prefix="Contact")]Contact contactMessage)

我希望这会有帮助,祝你好运

第二个表单标签是否有?我确认,第二个不起作用。参数为
null
。可能是DefaultModelBinder中的一个bug。恭喜你有了一个愚蠢的标题。你能考虑换一下吗?或者他没有表格标签。看不到任何其他问题。+1。是的-我的第一个想法是不重建这个项目。@RichardOD,不幸的是这不是问题的根源。@Darin。有趣-如果我有机会亲自尝试,我会投票给你的答案。我想现在一个好的策略是调试ModelBinder,如果你说某个地方有一个bug的话。Nice最后没有尝试过,但是更新2非常有意义,所以+1。好吧,我接受这个答案,但是,它没有那么精彩,是吧!。为什么我不能有一个名为contactMessage的参数,即使在同名的对象中有一个属性?我们清楚地定义了我们想要传递到方法中的类型,而且由于我们不能重载,因此没有太多的歧义空间,我们应该从匹配的表单字段中创建对象&“属性”集-名称中有什么?。。。英雄联盟据我所知,这是一个“抓到”或“错误”,但只要我知道,我可以解决它。谢谢大家的帮助。@Paul-这不是虫子。DefaultModel绑定器还尝试将id映射到参数,它不知道您的意图是什么。不过,这肯定是让你大吃一惊的事情之一,这就是为什么我对你的问题投了赞成票!为了简洁,我去掉了标签。。。这是我的状态。诺洛:我不喜欢能做到这一点-酷!!!:-)我会尽量记住这一个。