我正在构建一个ASP.NET MVC项目,并采用以下体系结构:
那么,假设我想添加一个用户。我在核心项目中定义了一个。我给它一些数据注释,如[Required]。完成此操作后,网络项目将根据这些注释执行客户端验证。
我的问题是关于服务器端验证。我希望使用客户端使用的相同规则验证NewUserInputModel,并且我希望运行NewUserInputModel来自API或Web项目的验证。
我意识到我可以从Web项目中的Controller调用,但是我想从核心项目调用验证,这样所有的验证逻辑都位于Core中。这样,无论这个模型如何到达核心逻辑,我总是调用相同的验证。我不想将System.Web引用泄漏到我的核心项目中。
这是合理的设计吗?我想是的-但是如果有什么气味,我会很乐意听到的。
提前感谢您的帮助。
发布于 2013-11-19 13:31:58
我通常将视图模型保存在Web项目中,并使用ModelState属性在控制器中进行输入验证。如果成功,我将它们映射到域模型(它位于核心层),并将它们发送到服务中的服务(也可以是Core)层。服务层验证业务规则,如果成功,则调用存储库来执行所需的操作,并将操作结果返回给控制器。
将视图模型保存在Web项目中还允许您使用MVC验证属性,如RemoteAttribute。
我并不是说您的设计很难闻,但我确实认为将表示逻辑与核心层分开是很好的。
发布于 2014-02-26 19:41:04
我认为你的做法很好。将一组模型映射到另一组可能会带来一些bug。
您要查找的代码是:
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()));有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationcontext.aspx或http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx
发布于 2015-08-03 14:53:28
我快速思考的方法是做类似的事情。在业务层中创建
public class ValidationMessage
{
public ValidationMessage(string message, ValidationMessageType messageType)
{
Message = message;
MessageType = messageType;
}
public string Message { get; private set; }
public ValidationMessageType MessageType { get; private set; }
}
public enum ValidationMessageType
{
Info,
Warning,
Error,
}现在有一个服务示例
public interface ISomeService
{
List<ValidationMessage> Edit(SomeModel item);
}现在,在控制器中调用服务并将验证消息传递给视图。可能需要使用ViewBag并传递整个列表。在视图上,您可以高亮显示信息、警告、错误。例如,您可以使用Info类型返回一些成功消息,或者完全不返回,并在控制器中创建成功消息。
一般来说,这种方法是更多的编码,但更灵活。理想情况下,服务将验证一切,但对于较小的项目,以避免验证重复,正如Henk在他的回答中所述,您可以通过ViewModel进行用户输入验证,而在服务中只验证关键的业务规则。
ValidationMessageType也可能会导致过度,因此可以将服务中的List作为错误列表返回,而空列表将意味着成功。
https://stackoverflow.com/questions/20072173
复制相似问题