Asp.net mvc Asp.NETMVC2复选框在模型中始终为false

Asp.net mvc Asp.NETMVC2复选框在模型中始终为false,asp.net-mvc,Asp.net Mvc,我有这样一个复选框: <%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/> <input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" /> @Ht

我有这样一个复选框:

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/>
<input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" />
@Html.HiddenFor(x => x.IsSendingQualitySurvey)
这对于MVCModelbinder处理复选框的方式非常有效

然后在控制器操作中:

[HttpPost]
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel)
ticketEditViewModel.IsSendingQualitySurvey
(一个正常的bool)始终为false

我没有任何自定义模型活页夹,它可以在其他地方使用。 奇怪的是,不久前我在另一个视图中遇到了同样的问题,我必须手动创建输入,如下所示:

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/>
<input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" />
@Html.HiddenFor(x => x.IsSendingQualitySurvey)

这是可行的,但当我将完全相同的内容复制到另一个视图时,该值始终为false

陷阱在哪里


谢谢。

型号活页夹可能无法取出活页夹。我的建议是将您的操作更改为:

 [HttpPost] 
 public ActionResult Edit(Guid id, TicketEditViewModel model)
模型绑定器希望在请求中查找前缀与对象名称匹配的属性。由于客户端没有命名前缀,因此没有前缀为“ticketditviewmodel”的属性

另一种方法是在页面上命名变量:

 <% var ticketEditViewModel = Model; %>
 <%= Html.CheckBoxFor(model => ticketEditViewModel.IsSendingQualitySurvey) %>

ticketEditViewModel.IsSendingQualitySurvey)%%>

编辑得到了错误的棒端。。。对不起

您是否尝试过从post数据中提取原始值,如下所示:

在控制器中:

[HttpPost]
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel,
                                            FormCollection fc) {

    if(fc["IsSendingQualitySurvey"].Contains("true")) {
        //Do something.
    }
}    
他认为:

<%= Html.CheckBoxFor(model => model.IsSendingQualitySurvey) %>
model.IsSendingQualitySurvey)%>
希望这对以下车型有所帮助。

公共类StartViewModel{

public string Id{ get; set; }

public string Name { get; set; }

public bool Accept { get; set; }
}

->接受=错误

解决方案:将公共bool Accept{get;set;}更改为公共字符串Accept{get;set;}


提交时,如果选中复选框,则“接受”值=“on”。顺便说一下,您可以检测检查值。

我不确定这是否适用于您,但事实上它为我解决了同样的问题。尝试为同一模型的属性添加一个隐藏字段,如下所示:

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/>
<input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" />
@Html.HiddenFor(x => x.IsSendingQualitySurvey)

我忘了说模型实际上是以正确的方式填充的,只是缺少一个属性。此外,我认为模型绑定器并不关心前缀,因为它甚至没有被传输到结果输入,您确定吗?模型绑定器查看查询字符串或表单集合中包含的值,并尝试按名称绑定属性。客户端上的ID/Name字段(由HTML帮助程序生成)包含名称空间,并且是变量命名约定的直接结果。如果您有复杂的模型或在页面上创建变量,您会注意到HTML助手将在控件上生成与变量名匹配的前缀。在模型绑定器中可能有一些逻辑会覆盖不匹配的名称,但如果不挖掘反射器,我无法确定。嗯,所以可能因为我传递了两个参数,绑定器可能会引入名称空间,在这种情况下,由于我的约定,找不到模型参数?还没有看到那些名称空间。我将在明天研究这个问题,谢谢。我的模型很简单,所以没有引入名称空间之类的东西。表单集合具有与预期相同的
[true,false]
。重命名参数没有影响,并且在页面上引入您建议的变量不是一个解决方案(太难看了),与从formcollection读取值相同。。。
id
参数来自路由,模型填充正确。我不明白model binder到底是怎么回事,也许我遗漏了一些非常琐碎的东西?在没有让项目进行测试的情况下,我没有答案给你,但我确实找到了这个页面:你会注意到Dinoboy(第5篇文章)给出了一些关于如何在属性上调用model binder的代码。我建议您使用该代码段并更改字段名,然后尝试查看是否可以让MB正确解析您的属性并从中开始。请记住,bool属性的默认值是“false”。我没有找到它,所以我使用了
Request.Form[“IsSendingQualitySurvey”]。Contains(“true”)
,尽管它很难看=(