我正在看一个奇怪的(对我来说)问题,我试图根据复选框发布一个整数数组。如果未按顺序发布值,则模型绑定器似乎不会以我期望的方式运行。
我可以针对一个非常简单的动作重现这个
public ActionResult Debug(string[] Unassigned)
{
return RedirectToAction("Index", new { id = 7 });
}
这种不起作用的一个例子是当发布以下值时(通过即时窗口复制)。我希望Unassigned的值为8和6。
? Request.Form.AllKeys
{string[4]}
[0]: "__RequestVerificationToken"
[1]: "LoginId"
[2]: "Unassigned[1]"
[3]: "Unassigned[3]"
? Request.Form["Unassigned[1]"]
"8"
? Request.Form["Unassigned[3]"]
"6"
? Unassigned
null
当按顺序传递值时,这是有效的(注意Unassigned[3]
不会被绑定,因为Unassigned[2]
未发布。
? Request.Form.AllKeys
{string[5]}
[0]: "__RequestVerificationToken"
[1]: "LoginId"
[2]: "Unassigned[0]"
[3]: "Unassigned[1]"
[4]: "Unassigned[3]"
? Request.Form["Unassigned[0]"]
"2"
? Request.Form["Unassigned[1]"]
"8"
? Request.Form["Unassigned[3]"]
"6"
? Unassigned
{string[2]}
[0]: "2"
[1]: "8"
减去格式,我的HTML看起来像这样
<input type="checkbox" name="Unassigned[0]" value="2">
<input type="checkbox" name="Unassigned[1]" value="8">
<input type="checkbox" name="Unassigned[2]" value="7">
<input type="checkbox" name="Unassigned[3]" value="6">
<input type="checkbox" name="Unassigned[4]" value="5">
<input type="checkbox" name="Unassigned[5]" value="9">
<input type="checkbox" name="Unassigned[6]" value="4">
<input type="checkbox" name="Unassigned[7]" value="3">
<input type="checkbox" name="Unassigned[8]" value="1">
鉴于select is not broken,我做错了什么?
答案 0 :(得分:3)
鉴于选择没有被打破,我做错了什么?
您不尊重convention for binding to a list
,因为您的索引中有 hole 。您可以使用非顺序索引,例如Guids。看看我已经链接到的Phil Haacks博客文章。他有一整个专门的部分。
我建议你的其他可能性是使用视图模型。所以继续写一个:
public class ItemViewModel
{
public string Id { get; set; }
public bool Selected { get; set; }
}
然后你可以有一个控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new[]
{
new ItemViewModel { Id = "2" },
new ItemViewModel { Id = "8" },
new ItemViewModel { Id = "7" },
new ItemViewModel { Id = "6" },
new ItemViewModel { Id = "5" },
new ItemViewModel { Id = "4" },
new ItemViewModel { Id = "3" },
new ItemViewModel { Id = "1" },
};
return View(model);
}
[HttpPost]
public ActionResult Index(ItemViewModel[] model)
{
// everything will be correctly bound here
}
}
和相应的强类型视图:
@model ItemViewModel[]
@using (Html.BeginForm())
{
for (var i = 0; i < Model.Length; i++)
{
Html.HiddenFor(x => x[i].Id)
Html.CheckBoxFor(x => x[i].Selected)
}
<button type="submit">OK</button>
}