在ASP.NET MVC RC中的Html.Checkbox中提交值的疯狂问题
有些值不是来自Request.Params
在我的表格中,我在循环中有这条线:
<%=Html.CheckBox("cb" + p.Option.Id, p.Option.IsAllowed, new { value = 6 })%>
然后呈现给下一个:
<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" />
提交表格后我会得到类似的内容:
Form.Params["cb17"] = {6, "false"}
Form.Params["cb18"] = {6, "false"}
Form.Params["cb19"] = {"false"}
Form.Params["cb20"] = {"6,false"}
Form.Params["cb21"] = {"false"}
在请求字符串中有些参数显示两次(正常情况),有些仅显示一次(仅隐藏字段的值)。 它似乎不依赖于是否检查了复选框,值是否已更改等等...
有人遇到过这样的情况吗?我该如何解决?
答案 0 :(得分:16)
<% using(Html.BeginForm("Retrieve", "Home")) %>//Retrieve is the name of the action while Home is the name of the controller
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
并在您的控制器中
List<app>=newApps; //Database bind
for(int i=0; i<app.Count;i++)
{
var checkbox=Request.Form[""+app[i].ApplicationId];
if(checkbox!="false")// if not false then true,false is returned
}
你检查错误的原因是因为Html Checkbox帮助器为值true做了某种怪异的事情
True返回为:
it makes the string read "true, false"
所以你可能认为这是两个值,但它只是一个并且意味着真实
错误返回:
it makes the string read "false"
答案 1 :(得分:10)
这实际上是它应该按照规范工作的方式。
它与ASP.NET MVC无关,但如果未选中复选框,则POST集合中包含 。
你得到两个值,因为你有一个复选框和一个具有相同名称的输入(你有两个值的那些很可能是选中复选框的那些)。
编辑:来自W3C的specifications
答案 2 :(得分:2)
在表单提交/保存之前无需向数据库询问数据(无状态模式)我已经生成了这样的代码:
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));
}
}
}
谢谢你们帮助我解决这个问题!
答案 3 :(得分:0)
我用这个:
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;