Mat*_*ttW 11 validation asp.net-mvc-4
我正在构建一个ASP.NET MVC项目,并采用以下架构:
所以,假设我想添加一个用户.我NewUserInputModel在Core项目中定义了一个.我给它一些数据注释,如[Required].执行此操作后,Web项目将根据这些注释执行客户端验证.
我的问题是关于服务器端验证.我要验证的NewUserInputModel使用正在在客户端使用相同的规则,我想运行一个验证的天气NewUserInputModel从进来API或网络项目.
我意识到我可以ModelState.IsValid从Web项目中的Controller 调用- 但是我想从Core项目中调用该验证,以便所有验证逻辑都存在于Core中.这样,无论这个模型如何进入Core逻辑,我总是调用相同的验证.我不想将System.Web引用泄漏到我的Core项目中.
这是一个合理的设计吗?我认为是 - 但如果有什么东西闻起来,我会很高兴听到它.
在此先感谢您的帮助.
Tom*_*bes 15
我认为你的方法很好.将一组模型映射到另一组模型可能会带来一些错误.
您正在寻找的代码是:
using System.ComponentModel.DataAnnotations;
var context = new ValidationContext(model, serviceProvider: null, items: null);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model, context, results);
if (!isValid)
throw new Exception("Model is not valid because " + string.Join(", ", results.Select( s => s.ErrorMessage).ToArray()));
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationcontext.aspx或http://odetocode.com/blogs/scott/archive/2011/06/29/manual -validation与-数据annotations.aspx
我通常将视图模型保留在 Web 项目中,并使用该属性在控制器中进行输入ModelState验证。如果成功,我会将它们映射到域模型(位于核心层)并将它们发送到服务(也可能是核心)层中的服务。服务层验证业务规则,如果成功,它将调用存储库来执行所需的操作,并将操作结果返回给控制器。
将视图模型保留在 Web 项目中还允许您使用 MVC 验证属性,例如RemoteAttribute.
我并不是说你的设计有味道,但我确实认为将表示逻辑与核心层分开是很好的。