【问题标题】:checkbox returning "true,false" from formcollection instead of selected value复选框从表单集合返回“true,false”而不是选定值
【发布时间】:2012-03-27 12:28:06
【问题描述】:

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

当使用 ajax 在 js 文件中提交表单时,如下所示 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 时从表单集合中检索复选框的更新值

【问题讨论】:

    标签: asp.net-mvc checkbox


    【解决方案1】:

    试试这样:

    $.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) %>
    <% } %>
    

    【讨论】:

    • 我还有其他控件,例如 Html 文本框、下拉菜单……也……请告诉我如何处理同样的问题
    • @user1065358,您只需将相应的属性添加到您的视图模型。
    【解决方案2】:

    你总是可以试试这个:

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

    【讨论】:

    • 我也注意到了这一点,并且过去曾在旧版本的 IE 中看到过这种情况(或者如果我使用 javascript 是这样吗?)无论如何,我修改了 Trent 的答案以防有人不知道如何考虑这两种情况:) : - bool checkedValue = (fc["checkbox0"] != null && (fc["checkbox0"].Contains("true") || fc["checkbox0"].Contains(" on")) ? true : false);
    【解决方案3】:

    试试这个

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

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题,然后遇到了下面的链接 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 值,那么就不要在 if 语句中检查 $(checkBoxesInListSelector).length > 1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 2021-08-24
        相关资源
        最近更新 更多