Asp.net mvc 复选框返回“;“对,错”;从formcollection而不是所选值
我在我的aspx页面中使用HtmlHelper.CheckBox有多个复选框 在js文件中使用ajax提交表单时Asp.net mvc 复选框返回“;“对,错”;从formcollection而不是所选值,asp.net-mvc,checkbox,Asp.net Mvc,Checkbox,我在我的aspx页面中使用HtmlHelper.CheckBox有多个复选框 在js文件中使用ajax提交表单时 var-input=$(':input') 在控制器动作方法中,如下所示 public ActionResult Post(FormCollection Form) { } 在表单中,我没有得到复选框的更新值,即所有复选框值都已更新 返回为“true,false”。 如果任何复选框没有被选中或取消选中…表单不会返回为false,它仍然返回为“true,false”而不是fa
var-input=$(':input')代码>
在控制器动作方法中,如下所示
public ActionResult Post(FormCollection Form)
{
}
在表单中,我没有得到复选框的更新值,即所有复选框值都已更新
返回为“true,false”。
如果任何复选框没有被选中或取消选中…表单不会返回为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检索复选框的更新值
$.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) %>
<% } %>
x、 项目[i].Id)%>
x、 项目[i].IsSelected)%>
您可以尝试以下方法:
bool checkedValue = Form["checkbox0"].Contains("true");
试试这个
string abc = ((string[])(collection.GetValue("checkbox0").RawValue))[0];
我也遇到了同样的问题,然后遇到了下面的链接
$(窗口)。加载(函数(){
$(“输入:复选框”)。每个(函数(){
fixHiddenCheckField(此字段);
});
$(“输入:复选框”).change(函数(){
fixHiddenCheckField(此字段);
});
});
函数fixHiddenCheckField(checkField){
变量名称=$(checkField).attr(“名称”);
var hiddenSelector=“输入:隐藏[name=“+name+”]”;
var checkBoxesInListSelector=“输入:复选框[name=“+name+”]”;
var checkedCheckBoxesInListSelector=“输入:选中[name=“+name+”]”;
if($(checkedCheckBoxesInListSelector).length>=1 | |$(checkBoxesInListSelector).length>1){
$(“输入”).remove(隐藏选择器);
}
否则{
if($(hiddenSelector).length==0)
$(checkField).parents(“表单”).append(“”);
}
}
在博客中解释说,上面的代码在选中复选框时删除隐藏字段,然后在未选中时将一个重复字段添加回父窗体。要处理列表,请检查具有此名称的复选框的总长度。如果有多个字段,则假定这是一个列表,因此我们将删除隐藏字段。如果我们需要一个未经检查的列表来生成单个值false,只需在If语句中不检查$(checkBoxesInListSelector).length>1。我还有其他控件,如Html文本框、下拉列表……还有……请告诉我如何处理该值same@user1065358,您只需将相应的属性添加到视图模型中即可。我也注意到了这一点,并且在过去的IE旧版本中也看到过这种情况(或者如果我使用javascript?),无论如何,我修改了Trent的答案,以防有人不知道如何解释这两种情况:):-bool checkedValue=(fc[“checkbox0”!=null&(fc[“checkbox0”].Contains(“true”)| | fc[“checkbox0”]。Contains(“on”)?true:false);
string abc = ((string[])(collection.GetValue("checkbox0").RawValue))[0];
$(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' />");
}
}