1

我想从头开始构建一个动态表单,并且我已经创建了以下元素:

包含我要显示的所有字段的 xml 文件:

<?xml version="1.0" encoding="utf-8" ?>
<Fields>
    <FieldList>
        <Field>
            <Type>checkbox</Type>
            <Name>gender</Name>
            <DefaultValue>false</DefaultValue>
            <CssClass>myclass</CssClass>
        </Field>
        <Field>
            <Type>textbox</Type>
            <Name>name</Name>
            <DefaultValue>fill name</DefaultValue>
            <CssClass>formtextbox</CssClass>
        </Field>
    </FieldList>
</Fields>

输入到我用来反序列化 xml 的类的视图:

@model Fields
@{
    if(Model!=null)
    {
        using (Html.BeginForm())
        {
            foreach (Field field in Model.FieldList)
            {
                switch(field.Type)
                {
                    case "textbox":
                        @Html.TextBox(field.Name, field.DefaultValue);
                    break;

                    case "checkbox":
                        @Html.CheckBox(field.Name,Convert.ToBoolean(field.DefaultValue));
                    break;
                }
            }    
        }
    }
}

目前该应用程序正常运行,但我有以下疑问:

1)我认为这不是一个优雅的解决方案,因为我必须在视图中放置太多代码,对吧?

2)我现在想添加一些服务器验证。我通常使用数据注释,但我想这是不可能的,因为我不知道我提交的东西是怎样的。有什么方法可以动态创建类实例并动态添加数据注释?

3)我创建了另一个处理帖子的动作和控制器。因为我不知道我提交的操作是什么,所以我没有收到任何参数。我想我必须从我的行动中使用 Request.Form 对吗?

4

2 回答 2

1

我的第一个想法是实现一个自定义 HtmlHelper 方法,该方法将获取 XML 并为您生成视图。就像那样,您的视图中只有一行代码。
至于验证,您可以扩展 DataAnnotationsModelValidatorProvider 并覆盖 GetValidators() 以根据您认为合适的任何参数或策略注入默认的 mvc 验证器和/或您自己的验证器。这些也将传播到客户端。

于 2012-08-07T13:02:54.950 回答
0

我建议添加不止一种类型:

abstract class Field {
     public string Name {get;set; }
}

class BooleanField : Field{
     public bool Value { get;set; }
}

class TextField : Field{
      public string ValidationRegEx { get; set }
      public string Value { get;set; }
}

等等。

还为每种类型添加编辑器模板

要为 TextField 添加验证,您可以创建自定义验证属性,该属性检查与验证 reg ex 匹配的值

于 2012-08-07T13:06:28.710 回答