首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Asp.Net MVC3:在ValidationContext中设置自定义IServiceProvider,以便验证器可以解析服务

在Asp.Net MVC3中,ValidationContext是一个用于验证模型的上下文对象,它可以提供一些有用的信息,如模型实例、模型元数据、服务提供者等。在某些情况下,我们可能需要在ValidationContext中设置自定义的IServiceProvider,以便验证器可以解析服务。

首先,我们需要创建一个自定义的IServiceProvider实现,例如:

代码语言:csharp
复制
public class CustomServiceProvider : IServiceProvider
{
    private readonly IServiceProvider _serviceProvider;

    public CustomServiceProvider(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public object GetService(Type serviceType)
    {
        // 在这里可以自定义服务解析逻辑
        if (serviceType == typeof(IMyService))
        {
            return new MyService();
        }

        return _serviceProvider.GetService(serviceType);
    }
}

接下来,我们需要在模型验证器中使用自定义的IServiceProvider。例如,在IValidatableObject接口的Validate方法中:

代码语言:csharp
复制
public class MyModel : IValidatableObject
{
    [Required]
    public string Name { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var serviceProvider = validationContext.GetService<IServiceProvider>();
        var myService = (IMyService)serviceProvider.GetService(typeof(IMyService));

        // 使用myService进行验证逻辑
        // ...
    }
}

最后,我们需要在控制器中设置自定义的IServiceProvider。例如,在控制器的构造函数中:

代码语言:csharp
复制
public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    [HttpPost]
    public ActionResult Create(MyModel model)
    {
        var validationContext = new ValidationContext(model, null, new CustomServiceProvider(HttpContext.RequestServices));
        var validationResults = new List<ValidationResult>();

        if (!Validator.TryValidateObject(model, validationContext, validationResults, true))
        {
            // 处理验证失败的情况
            // ...
        }

        // 处理验证成功的情况
        // ...
    }
}

通过以上步骤,我们可以在ValidationContext中设置自定义的IServiceProvider,以便验证器可以解析服务。这种方法可以让我们更灵活地控制服务解析逻辑,以满足不同的业务需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ASP.NET MVC编程——模型

2模型绑定 默认模型绑定 通过DefaultModelBinder解析客户端传来的数据,为控制的操作参数列表赋值。...MinLength 设置数组或字符串最小长度 MaxLength 设置数组或字符串最大长度 Remote 通过控制操作验证指定字段 public RemoteAttribute(string action...,ValidationAttribute有两个虚方法,可以通过重载这两个虚方法来完成自定义验证逻辑。...当操作带有参数时,MVC框架使用模型绑定(默认的或自定义的)Http请求查找数据,用于构建控制操作的参数列表。 验证发生的时间 模型验证操作执行之前完成的。...当模型绑定器使用新值对模型属性更新后,会利用当前模型元数据获得模型验证,模型验证会找到所有施加于模型属性的特性并执行验证逻辑,然后模型绑定会捕获所有失败的验证规则,并将它们放入模型状态

2.4K80
  • 【译】.NET 7 预览版 1 ASP.NET Core 更新

    以下是我们计划重点关注的一些领域: 性能:.NET 6 包含对 ASP.NET Core 的许多性能改进,我们将努力使 ASP.NET Core .NET 7 更快、更高效。...更好地控制 Blazor 服务电路的生命周期。 改进了对微前端的支持。 MVC:对端点路由、链接生成和参数绑定的改进。...更快的标头解析和写入 gRPC JSON 转码 开始使用 要开始使用 .NET 7 Preview 1 ASP.NET Core,请安装 .NET 7 SDK。...将服务注入 Blazor 自定义验证属性 您现在可以服务注入 Blazor 自定义验证属性。 Blazor 将设置 ValidationContext以便可以用作服务提供者。...有关详细信息,请参阅以下拉取请求: HTTP/2:提高传入标头性能 HTTP/3:优化验证设置传入的标头 HTTP 标头枚举直接移至下一个 gRPC JSON 转码 gRPC JSON 转码允许 gRPC

    4K10

    EF Core 数据验证

    但是 Entity Framework Core (以下简称 EF Core )这些问题全可以解决。 EF Core 中有两种验证模式,分别是内置模型验证和第三方扩展模型验证。...下面我们就通过数据注解验证验证刚才添加的特性。...FluentValidation.AspNetCore 安装完成后我们需要为模型创建验证验证是一个继承自 AbstractValidator 的类,验证规则使用 RuleFor 方法定义验证构造函数...我们调用 AddFluentValidation 方法会将 FluentValidation 服务添加到 Asp.Net Core ,然后使用 RegisterValidatorsFromAssembly...AbstractValidator 存在 EnsureInstanceNotNull 方法,这个方法实例为 null 时会抛出异常,即使重写该方法也无法返回自定义的错误信息。

    1.2K20

    MVC 3.0 的新特性 摘要

    前言 ASP.NET MVC3 ASP.NET MVC 1 和 2 的基础上,增加了大量的特性,使得代码更加简化,并且可以深度扩展。...ASP.NET MVC3 ,增加视图的对话框中允许你选择你希望的视图引擎,新建项目对话框,你可以指定项目默认的视图引擎,可以选择 WebForm,Razor,或者开源的视图引擎,例如:Spark,... MVC3 ,已经不再需要了,因为默认就会启用客户端验证可以 web.config 关闭。...这允许客户端的验证库自动调用一个你定义服务上的自定义的方法来完成只能在服务上完成的验证逻辑。...无 Session 的控制支持 MVC3 可以指定控制是否使用 Session 状态,进而,Session 是否是读写还是只读。

    2.6K10

    ASP.NET Core 基础知识】--MVC框架--Models和数据绑定

    ASP.NET Core MVC提供了强大的数据绑定功能,可以自动解析和映射这些复杂的数据结构。...与客户端验证相比,服务验证更为可靠,因为客户端验证可以被绕过,而服务验证实际的服务上执行的。...四、自定义绑定 4.1 自定义模型绑定 ASP.NET Core MVC可以通过自定义模型绑定来实现特定类型的自定义绑定逻辑。...4.2 自定义模型验证 ASP.NET Core MVC,你可以通过自定义模型验证来实现对模型数据的自定义验证逻辑。...在实践,我们学到了创建模型、数据绑定、服务端和客户端验证自定义模型绑定验证等基础概念。

    58510

    Asp.NetCore Web开发之输入验证

    开发验证表单数据是很重要的一环,如果对用户输入的数据不加限制,那么当错误的数据提交到后台后,轻则破坏数据的有效性,重则会导致服务瘫痪,这是很致命的。...MVC框架,也就是说我们可以直接引用,它们的引用如下所示: //如果你用的asp.net core MVC 你可以直接复制此代码到你需要的地方 <script src="~/lib/jquery-validation...<em>设置</em>以后,我们<em>可以</em>通过$('#被<em>验证</em>的form的id').valid()这个方法查看<em>验证</em>结果,也就是true和false,以此来判断是否该提交表单。...同样的,我们也<em>可以</em><em>自定义</em><em>验证</em>规则,但是<em>自定义</em>的规则,是在后台进行<em>验证</em>的,不会在前台直接提示: 方法一(继承ValidationAttribute类,重写IsValid()) public class...<em>在</em>需要<em>验证</em>PersonData的Action<em>中</em>,我们就<em>可以</em>进行<em>验证</em>,代码如下: Console.WriteLine(ModelState.IsValid); foreach (var prop in ModelState.Values

    2K30

    09:数据标注与数据校验

    它的用途主要可以分为下面这三类: 验证 Validation:向数据添加验证规则 展现 Display:指定数据如何呈现给用户 模型 Modelling:添加关于用法和与其它类的关系信息 下面是一个用来验证和展现用户信息的一个...例如, ASP.NET MVC ,Razor 引擎会根据 Model 属性的 DataType 特性动态生成不同类型的表单元素。...数据标注用来验证数据的合法性是最常见的用法, ASP.NET Core/Mvc ,数据作为表单 Model 提交时,框架会对 Model 数据自动进行校验,也可以手动调用 ModelState.IsValid...自定义校验特性 自定义一个校验特性很简单,创建一个继承 ValidationAttribute 的类,然后重写它的 IsValid 方法。...对象: ValidationContext vc = new ValidationContext(objectToValidate); 创建好这个上下文对象就可以对数据进行多种方式的校验了,比如校验对象的所有属性

    88040

    ASP.NET MVC基于标注特性的Model验证:ValidationAttribute

    对于后者,模板的占位符可以虚方法FormatErrorMessage中进行替换。该方法的参数name实际上代表的是对应的显示名称,即对应ModelMetadata的DisplayName属性。...当我们通过继承ValidationAttribute创建我们自己的验证特性的时候,可以通过重写公有方法IsValid或者受保护方法IsValid来实现我们自定义验证逻辑。...我们之所以能够通过重写任一个IsValid方法是我们自定义验证逻辑生效的原因在于这两个方法ValidationAttribute特殊的定义方法。...的IsValid方法的默认实现来说,验证失败的情况下会返回一个具体的ValidationResult对象,如果指定的ValidationContext不为Null,那么其MemberName属性表示的成员名称将会包含在该...ValidationAttribute的时候将应用在它上面的AttributeUsageAttrribute特性的AllowMultiple设置为True就可以将它们多次应用到被验证的属性或者类型上了呢

    1.7K110

    使用Data Annotations进行手动数据验证

    本文转载:http://www.cnblogs.com/TianFang/p/3606285.html Data Annotations是Asp.Net中用于表单验证的,它通过Attribute直接标记字段的有效性...Asp.Net程序(如控制台程序),我们也可以使用Data Annotations进行手动数据验证的,一个简单的例子如下(需要添加System.ComponentModel.DataAnnotations.dll...Attribute,但是,实际应用,我们仍然免不了要编写自己的验证规则,首先我们来看下其结构: ?...), new []{ validationContext.MemberName});         }     } 从上我们可以看到,IsValid是有两个版本的,我们实际上只需要重载一个即可,如果需要自定义错误信息可以用下面那个...WPF程序也有一套非常完善的数据验证框架值得学习一下,限于篇幅这里就不多介绍了,感兴趣的朋友可以看看这篇文章:Data validation in WPF 改进: *支持自定义ErrorMessage

    1K10

    ASP.NET Core 基础知识】--依赖注入(DI)--ASP.NET Core中使用依赖注入

    控制可以使用HttpContext.RequestServices属性获取IServiceProvider实例,并通过它来获取服务。...二、ASP.NET Core的依赖注入核心对象 2.1 解析Startup对象 ASP.NET Core,依赖注入(DI)的核心对象是IServiceProvider,它提供了对已注册服务解析。...解析Startup对象实际上意味着解析IServiceProvider提供的IServiceProvider实例,以便在应用程序启动过程中使用依赖注入。...使用DI: 应用程序的任何地方,都可以使用IServiceProvider解析服务。 例如,控制服务通过构造函数或属性注入来使用服务。...自定义中间件:如果你创建了一个自定义中间件,你可能需要在其他地方解析该中间件对象。

    35700

    Asp.net mvc 知多少(三)

    它的职责是转换服务模板为html标记并渲染呈现到浏览。最初,ASP.mvc只有一种视图引擎web forms(aspx) ,从ASP.NET MVC3 引入了新的Razor视图引擎。...通过global.asax.cs文件的Application_Start()方法注册自定义视图引擎,来告诉ASP.NET MVC来使用自定义视图引擎替换默认的视图引擎。...3、 Custom Html Helpers - 可以通过扩展HtmlHelper类或者通过创建在工具类创建静态方法来创建自定义Html Helper。...ASP.NET MVC提供了基于jquery的非侵入ajax。非侵入式ajax意味着通过使用帮助类方法去定义ajax功能而不是通过view添加js代码块。 Q38....默认来说,浏览只允许ajax调用你自己服务上托管的当前web应用的站点。这个限制帮助组长了许多安全问题(比如XSS攻击)。

    2.3K60

    ASP.NET MVC5的Model验证

    Model验证ASP.NET MVC的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVCModel验证的几种方式。...ValuationAttribute 除了使用DataAnnotation预定义的一些特性进行数据验证外,我们还可以自定义一些验证特性。...前端验证 上述验证均是服务端进行的,除此之外我们也可以使用js客户端进行数据的验证。...除了我们自己手写js代码外,ASP.NET MVC也提供了前端验证方法,要启用ASP.NET MVC提供的前端验证方法需要在页面引入三个js文件: jquery-1.10.2.min.js(也可以是其它版本的...引用文件之后,运行程序,然后查看页面源代码,可以看到form的input标签多出了 data-val 属性以及其它的和数据注解相关的属性。 对于验证失败的信息,我们需要对用户进行相应的提醒。

    1.5K20

    C# 特性 System.ComponentModel 命名空间属性方法大全,System.ComponentModel 命名空间的特性

    实际使用,我们可以控制台、Winform 等项目的 Model 中加此特性,控制属性输入。然而并不是说控制台也是也能生效,只是能够用到。后面会解释到。...Validator 定义一个帮助类,与对象、属性和方法关联的 ValidationAttribute 特性包含此类时,可使用此类来验证这些项。...ErrorMessage 获取或设置一条验证失败的情况下与验证控件关联的错误消息。...CurrentChangedEventManager 提供 WeakEventManager 实现,以便可以使用“弱事件侦听”模式附加 CurrentChanged 事件的侦听。...ErrorsChangedEventManager 提供 WeakEventManager 实现,以便可以使用弱事件侦听模式附加 ErrorsChanged 事件的侦听

    4.2K30

    Asp.Net MVC3 简单入门第一季(二)详解Asp.Net MVC3项目

    前言 在上一篇文章Asp.Net MVC3 简单入门第一季(一)环境准备我简单介绍了Asp.Net MVC3项目的安装和第一个Asp.Net MVC3项目的基本情况。...这是由于MVC秉承了“约定大于配置”的思想,我们使用Asp.Net MVC3开发项目时也要注意,一定要按照它的约定办事,比如:Controller返回Action后需要一个View进行展示(当然是调用了...看下表所示的就是Asp.Net MVC3各个文件夹的作用。...WebConfig文件,配置了启用客户端脚本验证、配置了System.Web.Routing、System.Web.Mvc等组件。...讲解之前我们先认识几个概念: Controller:控制Contrller文件夹添加的以Controller结尾的类就是控制,它的每个方法就是一个Action。

    95310

    C# API的模型和它们的接口设计

    因为存在这些限制,所以不能在构造函数和属性设置中使用异常,就像你在其他类中使用异常一样。不过可以验证接口,为错误检查提供一些灵活性。...属性变化不应直接调用服务,因为这会使该类变得非常难以测试。如果你需要异步验证某些内容,请在控制或视图模型执行此操作。...通常这用于单属性验证,不过也可以通过ValidationContext来访问对象的其他属性。 基于属性的验证的一个优点是,一些框架(比如ASP.NET MVC/WebAPI)已经选定它作为验证接口。...文档说它“可以通过任何实现IServiceProvider接口的服务添加自定义验证”,但并没有说明IServiceProvider.GetService(Type)方法需要支持哪些类型,因此无法利用此特性...我们可以借此做一些有趣的事情,比如在后台进程更新模型或者多个视图之间共享模型。 实现属性变更通知最简单的办法是每次调用属性设置时触发它们。虽然从技术方面看是可行的,但仍有一些性能方面的影响。

    1.6K20

    从EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入

    使用EF的话不可避免要和DbContext打交道,Core的常规用法一般是:创建一个XXXContext类继承自DbContext,实现一个拥有DbContextOptions参数的构造启动类...Asp.Net Core,内置的DI有3种服务模式,分别是Singleton、Transient、Scoped,Singleton服务实例是保存在root provider的,所以它才能做到全局单例...由此可知,除非是root provider获取一个单例服务,否则必须要指定一个服务范围(Scope),这个验证是通过ServiceProviderOptions的ValidateScopes来控制的...默认情况下,Asp.Net Core框架在创建HostBuilder的时候会判定当前是否开发环境,开发环境下会开启这个验证: ? 所以前面那种关闭验证的方式是错误的。...我的思路大概是:创建一个自定义标签(Attribute),用来给需要注入的属性打标签,然后写一个服务激活类,用来解析给定实例需要注入的属性并赋值,某个类型被创建实例的时候也就是构造函数调用这个激活方法实现属性注入

    1.2K20

    ASP.NET Core创建基于Quartz.NET托管服务轻松实现作业调度

    在这篇文章,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业。这样的好处是我们可以应用程序启动和停止时很方便的来控制我们的Job的运行状态。...托管服务ASP.NET Core应用程序启动时启动,并在应用程序生命周期内在后台运行。通过创建Quartz.NET托管服务,您可以使用标准ASP.NET Core应用程序在后台运行任务。...它还允许您以集群方式运行应用程序的多个实例,以便在任何时候只能运行一个实例(高可用)。 本文中,我将介绍创建Quartz.NET作业的基本知识并将其调度为托管服务的计时上运行。...相反,我们可以提供一个自定义的IJobFactory挂钩到ASP.NET Core依赖项注入容器(IServiceProvider: using Microsoft.Extensions.DependencyInjection...,因此您可以IJob检索(并处理)作用域服务

    2.9K20
    领券