复选框从formcollection返回“true,false”而不是选定的值

时间:2012-03-10 06:41:19

标签: asp.net-mvc checkbox

我使用HtmlHelper.CheckBox在我的aspx页面中有多个复选框

并在js文件中使用ajax提交表单时 var input = $(':input');

   $.ajax({
    type: 'POST',
    url: "/Home/Post",
    data: input,
    dataType: 'json',
    success: function () {

    },
    });

并在控制器动作方法中如下所示..

 public ActionResult Post(FormCollection Form)
 {

 }

并在表单中我没有获取复选框的更新值,即所有复选框值都是 返回为“真,假”。 如果没有选中或取消选中任何复选框...表单不会返回false,它仍会返回“true,false”而不是false。

即使我尝试过

Form.Get("checkbox0").ConvertTo(typeof(Boolean))

Request.Form["checkbox0"]

aboce代码返回“true,false”但是复选框0未选中,所以它应该返回false,这不会发生.... ???

但是当我尝试在aspx文件中使用Html.BeginForm("Post","Home",FormMethod.Post,new {id="x"})时 并删除了js文件中的ajax调用... 然后控制器中的formcollection开始给我复选框的预期值... 但是随着这种方法一页一页地提交......我只需要使用ajax方法 ..

请告诉我如何在使用ajax 时从formcollection中检索复选框的更新值。

4 个答案:

答案 0 :(得分:11)

您可以随时尝试:

bool checkedValue = Form["checkbox0"].Contains("true");

答案 1 :(得分:3)

试试这样:

$.ajax({
    type: 'POST',
    url: '/Home/Post',
    data: $('form').serialize(),
    dataType: 'json',
    success: function () {

    },
});

我还建议您使用视图模型:

[HttpPost]
public ActionResult Post(MyViewModel model)
{
    ...
}

例如,您有一个值列表:

public class MyViewModel
{
    public ItemViewModel[] Items { get; set; }
}

public class ItemViewModel
{
    public int Id { get; set; }
    public bool IsSelected { get; set; }
}

并为您在强类型视图中生成了一个复选框列表:

<% for (var i = 0; i < Model.Items.Length; i++) { %>
    <%= Html.HiddenFor(x => x.Items[i].Id) %>
    <%= Html.CheckBoxFor(x => x.Items[i].IsSelected) %>
<% } %>

答案 2 :(得分:1)

试试这个

string abc =  ((string[])(collection.GetValue("checkbox0").RawValue))[0];

答案 3 :(得分:-1)

我也遇到了同样的问题,然后遇到了以下链接 http://www.mindstorminteractive.com/topics/jquery-fix-asp-net-mvc-checkbox-truefalse-value/

$(window).load(function () {
    $("input:checkbox").each(function () {
        fixHiddenCheckField(this);
    });

    $("input:checkbox").change(function () {
        fixHiddenCheckField(this);
    });
});

function fixHiddenCheckField(checkField) {
    var name = $(checkField).attr("name");
    var hiddenSelector = "input:hidden[name=" + name + "]";
    var checkBoxesInListSelector = "input:checkbox[name=" + name + "]";
    var checkedCheckBoxesInListSelector = "input:checked[name=" + name + "]";

    if ($(checkedCheckBoxesInListSelector).length >= 1 || $(checkBoxesInListSelector).length > 1) {
        $("input").remove(hiddenSelector);
    }
    else {
        if ($(hiddenSelector).length == 0)
            $(checkField).parents("form").append("<input type='hidden' name='"+name+"' value='false' />");
    }
}

在博客中解释说,上面的代码在选中框时会删除隐藏字段,然后在取消选中时将重复的字段添加回父表单。要处理列表,请使用此名称检查复选框的总长度。如果有多个,则假定这是一个列表,因此我们删除隐藏的字段。如果我们需要一个未经检查的列表来生成单个false值,则不要检查$(checkBoxesInListSelector).length&gt; if语句中的1。