我有一个MVC应用程序,我试图在其中使用nrules设置实体验证,因此我已经使用nrules-language创建了规则文件来对每个实体进行验证(例如ContactValidation.rul)。
NRules提供了实现复杂匹配表达式的接口方法,但是我不知道NRules语言中的语法会给我与ILeftHandSideExpression中存在的方法相同的行为(方法-全部,存在,存在,匹配,查询等) )和IRruHandSideExpression(方法-动作,执行,产量等)接口(以nrules语言显示)。
当前我的规则文件如下-
使用Form.Sample.Models;
使用系统;
使用System.Web.Mvc;
规则“联系验证”
何时
var实体= Contact(x => string.IsNullOrEmpty(x.Contact_FirstName),x => string.IsNullOrEmpty(x.Contact_LastName),x => string.IsNullOrEmpty(x.Contact_Email),x => string.IsNullOrEmpty (x.Contact_Phone));
var model = ModelStateDictionary();
然后
model.AddModelError(“ Contact”,“ Validation Failed”);
我正在通过-
启动应用程序期间加载所有规则public static ISessionFactory _compiledRuleFactory = null;
public static void LoadAllRulesInReposiotory()
{
var repository = new RuleRepository();
repository.AddReference(typeof(Contact).Assembly);
repository.AddReference(typeof(ModelStateDictionary).Assembly);
var ruleStream = GetAllRuleStream();
foreach (var item in ruleStream)
{
repository.LoadText(item);
}
var factory = repository.Compile();
_compiledRuleFactory = factory;
}
public static IEnumerable<string> GetAllRuleStream()
{
string[] filePaths = Directory.GetFiles(Path.Combine(HttpRuntime.AppDomainAppPath, "Rules"), "*.rul");
List<string> fileStreams = new List<string>();
foreach (var item in filePaths)
{
FileStream fs = new FileStream(item, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fs);
string text = reader.ReadToEnd();
fileStreams.Add(text);
}
return fileStreams;
}
我的控制器看起来-
public ActionResult Create(Contact contact)
{
//get static rule factory from global.asax
var ruleFactory = _compiledRuleFactory;
var session = ruleFactory.CreateSession();
session.Insert(contact);
session.Insert(ModelState);
session.Fire();
if (ModelState.IsValid)
{
db.Contacts.Add(contact);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(contact);
}
规则文件已加载并执行了规则,但是由于无法在Nrules语言中使用上述方法(查询,操作等),因此我无法添加复杂的验证行为。
此外,我想公开暴露实体验证失败的属性,并为每个属性提供独立的验证消息(例如,“ Contact_FirstName失败验证”,而不是常规的“验证失败”消息),应如何在规则文件?