我使用的是带有Razor和C的ASP.NET MVC3。我正在制作各种形式的表单生成器,因此我有一个包含以下对象的集合的模型:
public class MyFormField
{
public string Name { get; set; }
public string Value { get; set; }
public MyFormType Type { get; set; }
}
myformtype只是一个枚举,它告诉我表单字段是复选框、文本框、文件上载还是其他什么。我的编辑器模板如下所示(请参阅注释):
~/views/editortemplates/myformfield.cshtml
@model MyFormField
@{
switch (Model.Type)
{
case MyFormType.Textbox:
@Html.TextBoxFor(m => m.Value)
case MyFormType.Checkbox:
@Html.CheckBoxFor(m => m.Value) // This does not work!
}
}
我尝试在checkboxfor()的lambda表达式中将
m.Value
转换为bool,但这引发了一个错误。我只是手动构造一个复选框输入,但是CabrBox Fox()似乎做了两件我不能复制的事情:创建以某种方式由复选框填充的隐藏输入。这似乎是模型活页夹的特点。
从对象中生成名称,以便模型绑定器将值获取到正确的属性中。
有没有人知道在字符串上使用一种方法,或者一种手动复制它的功能的方法,这样我才能完成这项工作?
最佳答案
您还可以在viewmodel上添加一个属性:
public class MyFormField
{
public string Name { get; set; }
public string Value { get; set; }
public bool CheckBoxValue
{
get { return Boolean.Parse(Value); }
}
public MyFormType Type { get; set; }
}
你的观点是这样的:
@model MyFormField
@{
switch (Model.Type)
{
case MyFormType.Textbox:
@Html.TextBoxFor(m => m.Value)
case MyFormType.Checkbox:
@Html.CheckBoxFor(m => m.CheckBoxValue) // This does work!
}
}
如果要避免异常,请使用boolean.tryparse。