当尝试使用ASP.NET 5 RC1中的自定义模型 Binders 进行解析时,在调用操作时,我会在 Microsoft.AspNet.Mvc.ModelBinding.CompositeModelBinder
内抛出 NullReferenceException
.
Model binding in Startup:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.ModelBinders.Insert(0, new MyCustomModelBinder());
}
Custom model binder:
public class MyCustomModelBinder : IModelBinder
{
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyCustomClass) && bindingContext.ValueProvider.GetValue(bindingContext.ModelName) != null)
{
MyCustomClass model;
var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue as string;
if (MyCustomClass.TryParse(val, out model))
{
return Task.FromResult(ModelBindingResult.Success(bindingContext.ModelName, model));
}
}
return null;
}
}
Controller action:
[HttpGet]
public IActionResult GetSomething([ModelBinder(BinderType = typeof(MyCustomModelBinder))]MyCustomClass key)
{
return Json("Success!");
}
Exception:
System.NullReferenceException:未将对象引用设置为对象的实例 . 在Microsoft.AspNet.Mvc.ModelBinding.CompositeModelBinder.d__5.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在System的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) . Microsoft.AspNet.Mvc.Controllers.DefaultControllerActionArgumentBinder.d__6.MoveNext()中的Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices上Microsoft.AspNet.Mvc.Controllers.DefaultControllerActionArgumentBinder.d__9.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的.TaskAwaiter.ThrowForNonSuccess(任务任务)---来自先前位置的堆栈跟踪结束被抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(T在Microsoft.AspNet.Mvc.Controllers.DefaultControllerActionArgumentBinder.d__5.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d__52.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)---从抛出异常的上一个位置的堆栈跟踪结束---在System . System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d__51.MoveNext()---来自之前的堆栈跟踪结束抛出异常的位置---在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d__44.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.Compi位于Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler.d__6.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的lerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)---来自先前位置的堆栈跟踪结束异常被抛出---在Microsoft.AspNet.Mvc.Routing.InnerAttributeRoute.d__10.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)中---抛出异常的前一个位置的堆栈跟踪结束---在Microsoft.AspNet的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)中 . Routing.RouteCollection.d__9.MoveNext()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(T)在Microsoft.AspNet.Builder.RouterMiddleware.d__4.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)上询问任务---从抛出异常的上一个位置的堆栈跟踪结束---在系统System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于Microsoft.AspNet.Hosting.Internal.RequestServicesContainerMiddleware.d__3.MoveNext()---堆栈跟踪结束抛出异常的上一个位置---在Microsoft.AspNet.Hosting.Internal.HostingEngine的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . <> c__DisplayClass32_0 . <b__0> d.MoveNext()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在Microsoft.AspNet.Server.Kestrel.Http.Frame.d__79.MoveNext()上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
1 回答
请在
BindModelAsync
方法调用中将return null
更改为return Task.FromResult(ModelBindingResult.NoResult);
.在CompositeModelBinder.cs在64行
var result = await binder.BindModelAsync(bindingContext);
错误发生时框架等待Task
为null