我在这里的方法可能完全错误,但我正在慢慢学习 MVC...我有一个表单,用户必须根据此模型选择多个(或不选择)模块:
public class MyProductModule
{
public string ModuleName { get; set; }
public bool Checked { get; set; }
}
public class ProductRequest
{
public ProductRequest()
{
Modules = LoadModules();
}
public static List<MyProductModule> LoadModules()
{
return new List<MyProductModule>()
{
new MyProductModule() { ModuleName = "Module One", Checked = false },
new MyProductModule() { ModuleName = "Module Two", Checked = false },
new MyProductModule() { ModuleName = "Module Three", Checked = false }
};
}
[Required]
[EmailAddress]
public string Email { get; set; }
[DisplayName("MyProduct Modules")]
public List<MyProductModule> Modules { get; set; }
}
渲染一个复选框列表来显示每个模块:
@for (int i = 0; i < Model.Modules.Count; i++)
{
@Html.CheckBoxFor(m => m.Modules[i].Checked)
@Html.HiddenFor(m => m.Modules[i].ModuleName)
@Html.LabelFor(m => m.Modules[i].Checked, Model.Modules[i].ModuleName)
}
最后,表单的处理如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ProcessRequest(ProductRequest qd)
{
if (!ModelState.IsValid)
{
return View("Index", qd);
}
else
{
// check email domains
List<string> badDomains = new List<string>();
badDomains.Add("gmail");
badDomains.Add("yahoo");
badDomains.Add("hotmail");
foreach (string s in badDomains)
{
if (qd.Email.Contains(string.Format("@{0}.", s)))
{
ModelState.AddModelError(string.Empty, string.Format("Please use your work email address.", s));
}
}
if (!ModelState.IsValid)
{
return View("Index", qd);
}
else
{
// process
}
}
}
一切都工作正常,除非由于某种原因我的服务器端验证失败,并且模型被发回(return View("Index", qd);
)。此时,复选框列表会神秘地发生变化:
[x] Module One
[ ] Module Two
[ ] Module Three
...对此:
[ ] Module One
[ ] Module Two
[ ] Module Three
所有复选框值都会丢失。如果我检查 Firebug 中的原始发布数据,我会发现由于某种原因,true 和 false 都发布为复选框“checked”值: