首页 文章

ASP.NET 5 MVC 6 RC1 API中使用自定义模型绑定的异常

提问于
浏览
1

当尝试使用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 回答

  • 1

    请在 BindModelAsync 方法调用中将 return null 更改为 return Task.FromResult(ModelBindingResult.NoResult); .

    CompositeModelBinder.cs在64行 var result = await binder.BindModelAsync(bindingContext); 错误发生时框架等待 Task 为null

相关问题