MVC动态表单如何添加验证

时间:2012-08-07 11:21:30

标签: c# asp.net-mvc

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

包含我想要显示的所有字段的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)我想现在添加一些服务器验证。我通常使用数据注释,但这是不可能的,因为我不知道我提交的是什么。有没有办法动态创建类实例并动态添加数据anotations?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

匹配的值