@ Html.CheckBoxFor返回无法将类型'string'隐式转换为'bool'错误

时间:2011-12-22 01:35:05

标签: asp.net asp.net-mvc-3 checkbox

所有

我正在尝试使用@ Html.CheckBoxFor。 这是我的代码:

型号:

public bool WC0001 { get; set; }

查看:

@using (Html.BeginForm("ListSearch", "Committee", FormMethod.Get))
{
    @Html.CheckBoxFor(model => model.WC0001)&nbsp;<label for="WC0001" class="mrg_r20">Development</label>
}

我也在使用WebGrid。 当我点击第2页时,我收到此错误。 无法将类型'string'隐式转换为'bool'

所以我看了一下网址。 这是“http://localhost:28685/Committee/ListSearch?WC0001=true%2cfalse&page=2

为什么我将WC0001参数设为true%2cfalse? 这是什么解决方法? 当我以前发布表格时没有发生。 但是因为我因为WebGrid而将其更改为FormMethod.Get,所以它开始发生。 请有人帮助我。

编辑: enter image description here

重新加载页面时会发生这种情况。

编辑:

这是我的行动代码:

[HttpGet]
public ActionResult ListSearch(Kuksiwon.Models.Committee profile, FormCollection collection)
{
    DataTable _dt = _bp.DtReturnS(false
        , "WSP_KW100_R1"
        , profile.APJIKJONGCODE == null ? "" : profile.APJIKJONGCODE
        , profile.APKUKSICODE == null ? "" : profile.APKUKSICODE
        , profile.CTNAME == null ? "" : profile.CTNAME
        , collection["CTSEXList"] == null ? "" : collection["CTSEXList"].ToString()
        , profile.CTOADDRESS1 == null ? "" : profile.CTOADDRESS1
        , profile.CTOADDRESS2 == null ? "" : profile.CTOADDRESS2
        , profile.CTUNIVCODE1 == null ? "" : profile.CTUNIVCODE1
        , profile.CTHOSPCODE1 == null ? "" : profile.CTHOSPCODE1
        , profile.CTETCNAME == null ? "" : profile.CTETCNAME
        , profile.CTUNIVDIV1 == null ? "" : profile.CTUNIVDIV1
        , profile.CTUNIVJIKUP1 == null ? "" : profile.CTUNIVJIKUP1
        , profile.CTEMAIL == null ? "" : profile.CTEMAIL
        , profile.WC0001 ? "WC0001" : ""
        , profile.WC0002 ? "WC0002" : ""
        , profile.WC0003 ? "WC0003" : ""
        , profile.WC0004 ? "WC0004" : ""
        , profile.WC0005 ? "WC0005" : ""
        , profile.WC0006 ? "WC0006" : ""
        , profile.WC0007 ? "WC0007" : ""
        , profile.WC0008 ? "WC0008" : ""
        , profile.WCNONE ? "1" : "0"
        , profile.RSNAME == null ? "" : profile.RSNAME
        , profile.BKNAME == null ? "" : profile.BKNAME
        , profile.CTSUBJECT == null ? "" : profile.CTSUBJECT
        , profile.CTCOLLEGE == null ? "" : profile.CTCOLLEGE
    );
    ViewBag.ListSearch = _dt;

    profile.CTSEXList = profile.CommonCodeList("SX", "1");
    return View(profile);
}

3 个答案:

答案 0 :(得分:1)

这是一个错误(好吧,我认为这是一个错误)在MVC为@Html.CheckBoxFor()吐出的内容 - 它吐出实际输入复选框,但也是一个具有相同名称的隐藏字段。他们这样做是为了使HTTP帖子具有默认值(如果未选中该复选框)仍然与数据一起发送。但对于GET,浏览器会在查询字符串中发送这两个值,导致它作为字符串数组出现在服务器上(导致您的异常)。

这是我最终使用的jQuery,如果选中了复选框,则禁用隐藏字段(禁用字段永远不会通过FORM提交发送)。将此贴在您的文档就绪逻辑中:

$('input[type=checkbox] ~ input[type=hidden]').each(function() {
    var curHiddenField = $(this);
    var checkBox = curHiddenField.prev();
    checkBox.change(function () {
        curHiddenField.val(checkBox[0].checked);
        if (checkBox[0].checked) {
            curHiddenField.attr('disabled', 'disabled');
        } else {
            curHiddenField.removeAttr('disabled');
        }
    }).change();
});

答案 1 :(得分:0)

我能想到的唯一可能原因是导致此问题的原因是您的ModelState被修改为无效值。这是在呈现页面时获取错误的唯一方法。

您应该像这样检查控制器中的ModelState

var wc0001 = ModelState["WC0001"].Value;
var raw = wc0001.RawValue; // Should be ["true", "false"]
var attempted = wc0001.AttemptedValue; // Should be "true,false"
var converted = wc0001.ConvertTo(typeof(bool)); // If this fails, then Html.CheckBoxFor will fail too.

更新

在查看您的操作方法后,我看不到任何会导致无效ModelState的内容。请告诉我.RawValue.AttemptedValue的值,因为这些可能会对此问题的原因有所了解。

答案 2 :(得分:0)

经过一些测试后,我想我可能已经找到了你的问题。

您可能知道,渲染CheckBox会产生一个<input type="checkbox" /><input type="hidden" />同名的结果。如果选中该复选框,则在提交表单时,GET / POST将具有该字段的重复条目:
ListSearch?WC0001=true&WC0001=false
MVC将这些值视为字符串数组 ["true", "false"],当它绑定到bool时,它只会解析第一个数组项。

您现在可能已经意识到了这个问题。您的示例网址已将这些值合并为:
ListSearch?WC0001=true,false
MVC会将此值视为单个字符串 "true,false",这意味着它将无法绑定到bool

问题几乎肯定是由创建URL的一些JavaScript造成的,并且脚本可能试图变得聪明并将重复输入组合到以逗号分隔的列表中。但是,这对MVC不起作用,因此您需要将值保持分开。