【问题标题】:TryValidateModel in ASP.NET MVC 6ASP.NET MVC 6 中的 TryValidateModel
【发布时间】:2015-11-17 10:14:58
【问题描述】:

我正在编写一个类似的测试框架:https://github.com/ivaylokenov/MyTested.WebApi,但用于 ASP.NET 5 MVC 6(使用 6.0.0-beta8)。

我很难尝试调用控制器的 TryValidateModel 来验证给定对象的 ModelState。它在 ASP.NET Web API 2 控制器上没有任何痛苦。我应该在控制器类上实例化哪些属性,以便使用默认约定验证方法。无论模型和属性属性如何,我都会收到空引用异常或有效模型状态。

我已经在MVC 源代码中搜索了几个小时,但没有成功。我试图在控制器上设置 AddMvc() 服务 - 不适合我。我什至尝试了他们位于HERE 的测试控制器类型(GetController 私有方法),但没有运气。这是我目前使用的来源:

        // TODO: for real this is how we configure controller?
        var detailsProviders = new IMetadataDetailsProvider[]
        {
            new DefaultBindingMetadataProvider(new ModelBindingMessageProvider
            {
                MissingBindRequiredValueAccessor = name => $"A value for the '{ name }' property was not provided.",
                MissingKeyOrValueAccessor = () => $"A value is required.",
                ValueMustNotBeNullAccessor = value => $"The value '{ value }' is invalid.",
            }),
            new DefaultValidationMetadataProvider(),
            new DataAnnotationsMetadataProvider(),
            // new DataMemberRequiredBindingMetadataProvider(), TODO: not available in version 8 but it is in the source code of MVC
        };

        var compositeDetailsProvider = new DefaultCompositeMetadataDetailsProvider(detailsProviders);

        var metadataProvider = new DefaultModelMetadataProvider(compositeDetailsProvider);
        var httpContext = new DefaultHttpContext();
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

        var viewData = new ViewDataDictionary(metadataProvider, new ModelStateDictionary());
        var tempData = new TempDataDictionary(new HttpContextAccessor(), new SessionStateTempDataProvider());

        var bindingContext = new ActionBindingContext()
        {
            ModelBinder = new GenericModelBinder(),
            ValueProvider = new CompositeValueProvider(new IValueProvider[0]),
            InputFormatters = new List<IInputFormatter>(),
            ValidatorProvider = new DataAnnotationsModelValidatorProvider(
                options: null,
                stringLocalizerFactory: null)
        };

        this.Controller.ActionContext = actionContext;
        this.Controller.BindingContext = bindingContext;
        this.Controller.MetadataProvider = metadataProvider;
        this.Controller.ViewData = viewData;
        this.Controller.TempData = tempData;
        this.Controller.ObjectValidator = new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider);

任何帮助将不胜感激。提前谢谢!

【问题讨论】:

  • 错误是什么? :)
  • 无论模型和属性如何,我都会在 DataAnnotationsMetadataProvider 中收到空引用异常或有效模型状态。这些也是我设法解决的情况。

标签: c# asp.net unit-testing asp.net-core asp.net-core-mvc


【解决方案1】:

原来它实际上是 ASP.NET MVC 中的一个错误,团队将在下一个 RC2 版本中修复它:https://github.com/aspnet/Mvc/issues/3586

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多