Asp.net mvc MVC Html.CheckBox和表单提交问题
ASP.NET MVC RC中Html.Checkbox中提交值的疯狂问题 有些值只是不符合请求。Params 在我的表格中,循环中有一行:Asp.net mvc MVC Html.CheckBox和表单提交问题,asp.net-mvc,checkbox,Asp.net Mvc,Checkbox,ASP.NET MVC RC中Html.Checkbox中提交值的疯狂问题 有些值只是不符合请求。Params 在我的表格中,循环中有一行: 它将呈现给下一个: <input checked="checked" id="cb17" name="cb17" type="checkbox" value="6" /> <input name="cb17" type="hidden" value="false" /> <input checked="c
它将呈现给下一个:
<input checked="checked" id="cb17" name="cb17" type="checkbox" value="6" />
<input name="cb17" type="hidden" value="false" />
<input checked="checked" id="cb18" name="cb18" type="checkbox" value="6" />
<input name="cb18" type="hidden" value="false" />
<input id="cb19" name="cb19" type="checkbox" value="6" />
<input name="cb19" type="hidden" value="false" />
<input id="cb20" name="cb20" type="checkbox" value="6" />
<input name="cb20" type="hidden" value="false" />
<input checked="checked" id="cb21" name="cb21" type="checkbox" value="6" />
<input name="cb21" type="hidden" value="false" />
在请求字符串中,一些参数显示两次(正常情况),一些仅显示一次(仅显示隐藏字段的值)。
它似乎不依赖于复选框是否被选中,值是否已更改等等
有人面临这种情况吗?如何解决问题?根据规范,这实际上是它的工作方式 它与ASP.NET MVC无关,但是当复选框未选中时,它将不包含在POST集合中 您得到两个值,因为您有一个复选框和一个同名的输入(您有两个值的值很可能是选中复选框的值) 编辑:来自W3C 所以你可能认为这是两个价值观,但它只是一个,意味着真的 假返回为:
it makes the string read "true, false"
it makes the string read "false"
无需在表单提交后/保存前(无状态模式)询问数据库有关ID的信息,我生成了以下代码:
foreach (string key in Request.Form)
{
var checkbox = String.Empty;
if (key.StartsWith("cb"))
{
checkbox = Request.Form["" + key];
if (checkbox != "false")
{
int id = Convert.ToInt32(key.Remove(0, 2));
}
}
}
谢谢你们帮我解决这个问题 我用这个:
public struct EditedCheckboxValue
{
public bool Current { get; private set; }
public bool Previous { get; private set; }
public bool Changed { get; private set; }
public EditedCheckboxValue(System.Web.Mvc.FormCollection collection, string checkboxID) : this()
{
string[] values = collection[checkboxID].Split(new char[] { ',' });
if (values.Length == 2)
{ // checkbox value changed, Format: current,old
Current = bool.Parse(values[0]);
Previous = bool.Parse(values[1]);
Changed = (Current != Previous);
}
else if (values.Length == 1)
{
Current = bool.Parse(values[0]);
Previous = Current;
Changed = false;
}
else
throw new FormatException("invalid format for edited checkbox value in FormCollection");
}
}
然后这样称呼它:
EditedCheckboxValue issomething = new EditedCheckboxValue(collection, "FieldName");
instance.IsSomething = issomething.Current;
你的解决方案很好。但我在考虑无状态表单提交。关于你的例子,我不知道我刚刚更新的app[I]中有多少对象。应用程序[i]正在遍历页面上的表单id。由于复选框是动态绑定的,因此您必须在DB中找到id,然后比较表单中的每个值。是否有关于为什么会出现这种情况的正确解释?为什么“真,假”是真的?@chakrit-从来没有找到任何关于它的文档,只是我自己经历过。我不知道为什么html复选框帮助器的实现会带有额外的wierd行为,希望它在未来的MVC版本中得到修复,但是我认为这是为了在场景后面做一些事情。它确实让你在一个带有复选框和多个页面的网格中更容易确定哪些页面已从“真”变为“假”。这与您可能拥有与操作参数关联的复选框这一事实相结合,是我可以想到的实现此功能的两个原因。什么?这不是真的veggerby…在mvc中,复选框的呈现方式与普通html复选框不同是的,它们呈现为两个输入。但这并没有改变这样一个事实,即复选框不是POST值的一部分,除非选中,这是查看Form.Params[]时得到的结果。如果您在操作中将bool指定为参数,那么是的,它将按照“预期”工作。但这就是MVC的“魔力”。
foreach (string key in Request.Form)
{
var checkbox = String.Empty;
if (key.StartsWith("cb"))
{
checkbox = Request.Form["" + key];
if (checkbox != "false")
{
int id = Convert.ToInt32(key.Remove(0, 2));
}
}
}
public struct EditedCheckboxValue
{
public bool Current { get; private set; }
public bool Previous { get; private set; }
public bool Changed { get; private set; }
public EditedCheckboxValue(System.Web.Mvc.FormCollection collection, string checkboxID) : this()
{
string[] values = collection[checkboxID].Split(new char[] { ',' });
if (values.Length == 2)
{ // checkbox value changed, Format: current,old
Current = bool.Parse(values[0]);
Previous = bool.Parse(values[1]);
Changed = (Current != Previous);
}
else if (values.Length == 1)
{
Current = bool.Parse(values[0]);
Previous = Current;
Changed = false;
}
else
throw new FormatException("invalid format for edited checkbox value in FormCollection");
}
}
EditedCheckboxValue issomething = new EditedCheckboxValue(collection, "FieldName");
instance.IsSomething = issomething.Current;