Asp.Net Mvc 2复选框在模型中始终为false

时间:2012-01-17 17:10:43

标签: asp.net-mvc

我有一个像这样的复选框:

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/>

选中复选框并提交时,我会得到典型的2个表单值:

IsSendingQualitySurvey: true
IsSendingQualitySurvey: false

这对于mvc modelbinder处理复选框的方式非常有效。

然后在控制器动作中:

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

ticketEditViewModel.IsSendingQualitySurvey(普通布尔)总是假的。

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

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

这很有效,但是当我将完全相同的内容复制到另一个视图时,该值仍然总是为假。

抓住了吗?

感谢。

4 个答案:

答案 0 :(得分:1)

模型绑定器可能不会拾取绑定。我的建议是将你的行动改为:

 [HttpPost] 
 public ActionResult Edit(Guid id, TicketEditViewModel model)

模型绑定器想要在Request中查找具有与您的对象名称匹配的前缀的属性。由于客户端没有命名前缀,因此没有带前缀&#34; ticketEditViewModel&#34;的属性。

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

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

答案 1 :(得分:1)

编辑得到了错误的结局......对不起

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

在控制器中:

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

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

在视图中:

<%= Html.CheckBoxFor(model => model.IsSendingQualitySurvey) %>

希望这会有所帮助..

答案 2 :(得分:0)

以下型号:

public class StartViewModel {

public string Id{ get; set; }

public string Name { get; set; }

public bool Accept { get; set; }

}

- &GT; Accept = false。

解决方案:改变公共布尔接受{get;组;公共字符串Accept {get;组; }

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

答案 3 :(得分:0)

我不确定这是否对您有用,但事实上它为我解决了同样的问题。尝试添加(不替换)相同模型属性的隐藏字段,如下所示:

@Html.HiddenFor(x => x.IsSendingQualitySurvey)