虽然我不是专家,但我不得不创建一个解决方案,其中我的主要对象具有值列表。我们称之为Object A具有映射在数据库中的ApplicationValues列表。ApplicationValues具有Key(表单字段,例如PhoneNumber)和Value。
由于ApplicationValues是EntitySet,因此我必须创建get和set方法以正确处理设置特定的ApplicationValue。我还在我的数据库中拥有ApplicationRules列表,定义了这些应用程序值可以采用什么样的规则。
以下是一段代码片段,可能会帮助您开发符合您需求的解决方案。
public partial ApplicationValue
{
public string Key;
public string Value;
}
public partial ApplicationRule
{
public string ValidationFormat;
public string ValidationError;
public bool Required;
}
public partial class A
{
public void SetValue(string key, string value)
{
ApplicationValue v = ApplicationValues.SingleOrDefault
(k => k.Key == key);
if (v != null)
{
v.Value = value;
return;
}
v = new ApplicationValue
{
AffinityID = this.ID,
Key = key,
Value = value
};
ApplicationValues.Add(v);
}
public string GetValue(ApplicationField key)
{
return GetValue(key, String.Empty);
}
public string GetValue(ApplicationField key, string defaultValue)
{
if (ApplicationValues == null)
return defaultValue;
ApplicationValue value = ApplicationValues.SingleOrDefault
(f => f.Key == key.ToString());
return (value != null) ? value.Value : defaultValue;
}
接着为了进行表单验证,我会遍历ApplicationRules(定义字段是否必填、包含正则表达式等),并将其与FormCollection匹配。
public ActionResult Details(FormCollection form)
{
IList<ApplicationRule> applicationRules =
if (!(ValidateApplication(applicationRules, form, a)))
{
ModelState.AddModelError("message", "Please review the errors below.");
return View(a);
}
...
}
private bool ValidateApplication(IList<ApplicationRule> applicationRules,
FormCollection form, A a)
{
foreach (ApplicationRule ar in applicationRules)
{
string value = form[ar.Key];
if (value == null)
continue;
ModelState.SetModelValue(ar.Key, ValueProvider[ar.Key]);
if (ar.Required)
{
if (String.IsNullOrEmpty(value))
{
ModelState.AddModelError(ar.Key, "Field is required");
continue;
}
}
if (!String.IsNullOrEmpty(ar.ValidationFormat))
{
Regex re = new Regex(ar.ValidationFormat);
if (!re.IsMatch(value))
{
ModelState.AddModelError(ar.Key, ar.ValidationError);
continue;
}
}
a.SetValue(ar.Key, value);
}
return ModelState.IsValid;
}