我使用的是带有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。

08-03 23:17