C# ASP.NET MVC 6中的TryValidate模型
我正在编写一个类似的测试框架,如下所示:但是针对ASP.NET 5 MVC 6(使用6.0.0-beta8)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()服务-对我来说不起作用。我甚
我很难调用控制器的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引用异常,或者收到有效的模型状态,无论模型和属性如何。这些都是我设法解决的问题。