在我最近的应用程序中,我这样做了:
- 使用此模式调用的数据库表
CustomFields
:(CustomFieldId int PK, DisplayName nvarchar(50), Class int, Type int)
- 每个可扩展实体都有一个名为
CustomFieldValues
which is的新列nvarchar(MAX)
。每个实体都有一个进入Class
CustomFields 的数字。自定义字段值
- 然后是一些 ASP.NET MVC 视图黑客来显示自定义字段。
基本上,该表CustomFields
定义了每个字段(其名称、数据类型和与之关联的实体类),每个实体的CustomFieldValues
属性列出了实际数据,它被序列化为仅包含简单值的 CSV 字符串:字符串、整数,小数等,没有复杂类型或图形。
我将 ASP.NET MVC 用于前端的东西,因为 WebForms 实际上更难使用,尤其是动态添加的字段。我确实必须对绑定进行一些更改以确保我的模型被拾取,但一切都很好。
如果您使用的是 MVC,则需要一个如下所示的自定义 ViewModel 类:
public class CustomFormViewModel {
public List<CustomFieldViewModel> CustomFields { get; set; }
}
public class CustomFieldViewModel {
public Int32 CustomFieldId { get; set; } // the field ID for definition lookup
public String Value { get; set; }
}
然后在视图中:
<% for(int i=0;i<Model.CustomFields.Count;i++) { %>
<%= Html.TextBoxFor( m => m[i].Value ) %>
<% } %>
在你的行动中,一切都应该为你神奇地绑定:
[HttpPost]
public ActionResult CustomForm(CustomFormViewModel model) {
model.CutomFields[0].Value == "foo";
}
简单!
请注意,ASP.NET MVC 在绑定 this 时确实存在一些错误,找到它们很有趣!