C# ASP.NET MVC 6中的TryValidate模型

C# ASP.NET MVC 6中的TryValidate模型,c#,asp.net,unit-testing,asp.net-core,asp.net-core-mvc,C#,Asp.net,Unit Testing,Asp.net Core,Asp.net Core Mvc,我正在编写一个类似的测试框架,如下所示:但是针对ASP.NET 5 MVC 6(使用6.0.0-beta8) 我很难调用控制器的TryValidateModel来验证给定对象的ModelState。它在ASP.NET Web API 2控制器上运行时没有任何问题。我应该在控制器类上实例化哪些属性,以便使用默认约定验证方法。无论模型和属性属性如何,我都会收到null引用异常或有效的模型状态 我已经在源代码中搜索了几个小时,但运气不好。我试图在控制器上设置AddMvc()服务-对我来说不起作用。我甚

我正在编写一个类似的测试框架,如下所示:但是针对ASP.NET 5 MVC 6(使用6.0.0-beta8)


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

我已经在源代码中搜索了几个小时,但运气不好。我试图在控制器上设置AddMvc()服务-对我来说不起作用。我甚至尝试了他们的测试控制器类型(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);
//TODO:实际上,我们是如何配置控制器的?
var detailsProviders=新的IMetadataDetailsProvider[]
{
新建DefaultBindingMetadataProvider(新建ModelBindingMessageProvider
{
MissingBindRequiredValueAccessor=name=>$“未提供“{name}”属性的值。”,
MissingKeyOrValueAccessor=()=>$“需要一个值。”,
ValueMustNotBeNullAccessor=value=>$“值“{value}”无效。”,
}),
新建DefaultValidationMetadataProvider(),
新建DataAnnotationsMetadataProvider(),
//new DataMemberRequiredBindingMetadataProvider(),TODO:在版本8中不可用,但它在MVC的源代码中
};
var compositeDetailsProvider=新的DefaultCompositeMetadataDetailsProvider(detailsProviders);
var metadataProvider=新的DefaultModelMetadataProvider(compositeDetailsProvider);
var httpContext=new DefaultHttpContext();
var actionContext=new actionContext(httpContext,new RouteData(),new ActionDescriptor());
var viewData=newviewdatadictionary(metadataProvider,newmodelstatedictionary());
var tempData=new TempDataDictionary(new HttpContextAccessor(),new sessionstatempdataprovider());
var bindingContext=new ActionBindingContext()
{
ModelBinder=新的GenericModelBinder(),
ValueProvider=新的CompositeValueProvider(新的IValueProvider[0]),
InputFormatters=新列表(),
ValidatorProvider=新的DataAnnotationsModelValidatorProvider(
选项: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=新的DefaultObjectValidator(新的IEExcludeTypeValidationFilter[0],metadataProvider);

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

这实际上是ASP.NET MVC中的一个bug,团队将在下一个RC2版本中修复它:

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