我正在编写一个类似于这个的测试框架:https://github.com/ivaylokenov/MyTested.WebApi,但是针对 ASP.NET 5 MVC 6(使用 6.0.0-beta8)。
我试图调用控制器的 TryValidateModel 方法来验证给定对象的 ModelState,但是遇到了困难。在 ASP.NET Web API 2 控制器上,它可以毫不费力地工作。为了使该方法按照默认约定进行验证,我应该实例化控制器类的哪些属性?无论模型和属性特性如何,我都会收到空引用异常或有效的模型状态。
我已经在 MVC 源代码中搜索了几个小时,但没有找到解决方法。我尝试在控制器上设置 AddMvc() 服务,但对我没有用。我甚至尝试了他们位于 这里 的测试控制器类型(GetController 私有方法),但没有成功。以下是我目前使用的源代码:
任何帮助都将不胜感激。提前致谢!
我试图调用控制器的 TryValidateModel 方法来验证给定对象的 ModelState,但是遇到了困难。在 ASP.NET Web API 2 控制器上,它可以毫不费力地工作。为了使该方法按照默认约定进行验证,我应该实例化控制器类的哪些属性?无论模型和属性特性如何,我都会收到空引用异常或有效的模型状态。
我已经在 MVC 源代码中搜索了几个小时,但没有找到解决方法。我尝试在控制器上设置 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);
任何帮助都将不胜感激。提前致谢!