首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asp.NET MVC -验证控制器外部的模型

Asp.NET MVC -验证控制器外部的模型
EN

Stack Overflow用户
提问于 2013-11-19 12:57:06
回答 4查看 10.4K关注 0票数 17

我正在构建一个ASP.NET MVC项目,并采用以下体系结构:

  • 一个包含模型、验证、dto、逻辑等的核心项目。
  • 作为我的REST的ServiceStack API项目
  • ASP.NET MVC Web项目,即UI

那么,假设我想添加一个用户。我在核心项目中定义了一个。我给它一些数据注释,如[Required]。完成此操作后,网络项目将根据这些注释执行客户端验证。

我的问题是关于服务器端验证。我希望使用客户端使用的相同规则验证NewUserInputModel,并且我希望运行NewUserInputModel来自APIWeb项目的验证。

我意识到我可以从Web项目中的Controller调用,但是我想从核心项目调用验证,这样所有的验证逻辑都位于Core中。这样,无论这个模型如何到达核心逻辑,我总是调用相同的验证。我不想将System.Web引用泄漏到我的核心项目中。

这是合理的设计吗?我想是的-但是如果有什么气味,我会很乐意听到的。

提前感谢您的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-19 13:31:58

我通常将视图模型保存在Web项目中,并使用ModelState属性在控制器中进行输入验证。如果成功,我将它们映射到域模型(它位于核心层),并将它们发送到服务中的服务(也可以是Core)层。服务层验证业务规则,如果成功,则调用存储库来执行所需的操作,并将操作结果返回给控制器。

将视图模型保存在Web项目中还允许您使用MVC验证属性,如RemoteAttribute

我并不是说您的设计很难闻,但我确实认为将表示逻辑与核心层分开是很好的。

票数 2
EN

Stack Overflow用户

发布于 2014-02-26 19:41:04

我认为你的做法很好。将一组模型映射到另一组可能会带来一些bug。

您要查找的代码是:

代码语言:javascript
复制
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.aspxhttp://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx

票数 28
EN

Stack Overflow用户

发布于 2015-08-03 14:53:28

我快速思考的方法是做类似的事情。在业务层中创建

代码语言:javascript
复制
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,
}

现在有一个服务示例

代码语言:javascript
复制
public interface ISomeService
{
    List<ValidationMessage> Edit(SomeModel item);
}

现在,在控制器中调用服务并将验证消息传递给视图。可能需要使用ViewBag并传递整个列表。在视图上,您可以高亮显示信息、警告、错误。例如,您可以使用Info类型返回一些成功消息,或者完全不返回,并在控制器中创建成功消息。

一般来说,这种方法是更多的编码,但更灵活。理想情况下,服务将验证一切,但对于较小的项目,以避免验证重复,正如Henk在他的回答中所述,您可以通过ViewModel进行用户输入验证,而在服务中只验证关键的业务规则。

ValidationMessageType也可能会导致过度,因此可以将服务中的List作为错误列表返回,而空列表将意味着成功。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20072173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档