我想从头开始构建一个动态表单,我已经创建了以下元素:
包含我想要显示的所有字段的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吗?
答案 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
匹配的值