如何从自定义模型绑定器返回 HTTP 状态代码



我有一个自定义模型绑定器,它从 MEF 容器中提取接口的实现。它的实现方式如下:

public class PetViewModelBinder : DefaultModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var petId = bindingContext.ValueProvider.GetValue("id");
        var container = controllerContext.HttpContext.Application[MvcApplication.PLUGINS] as CompositionContainer;
        Lazy<IPet, IPetMetadata> pet = null;
        try
        {
            pet = container.GetExport(typeof(IPet), petId);
            var petVM = new Models.PetViewModel(pet);
            bindingContext.ModelMetadata.Model = petVM;
            return base.BindModel(controllerContext, bindingContext);
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            container.ReleaseExport(pet);
        }
    }

当 MEF 导出宠物 ID 时,这非常有效......但在导出不存在时返回 HTTP 状态 500(服务器错误)。错误消息模糊处理要求规定应返回 http 状态 403(禁止)。

可以执行哪些操作来捕获错误、更改响应状态、不返回内容或重新路由操作以处理这种情况?

如果要

返回特定的http状态代码,则应从控制器或操作筛选器执行此操作。

执行此操作的一种方法是从模型绑定器返回 null 并在控制器中处理它。但是,这有点粗糙,因此您将无法区分不同的错误。

另一种方法是抛出一个特定的异常并在(全局)错误处理中处理它。自定义的 HandleError 操作筛选器可以执行以下操作:

public class CustomHandleErrorAttribute : HandleErrorAttribute
{
  public int StatusCode { get; set; }
  public override void OnException( ExceptionContext filterContext )
  {
     base.OnException( filterContext );
     if ( StatusCode > 0 )
     {
        filterContext.HttpContext.Response.StatusCode = StatusCode;
     }
  }
}

在控制器中,使用此属性修饰操作:

[CustomHandleError( ExceptionType = typeof (NotAllowedException), View = "~/Views/Shared/Error.cshtml",
     StatusCode = 403 )]
public ActionResult Index( FancyModel model )
{
   return View( model );
}

最后,在模型绑定器中抛出 NotAllowedException,这是您还需要定义的自定义异常类型。

请注意,只有在 web.config 文件中启用了自定义错误时,这才适用于您的开发设置。

相关内容

  • 没有找到相关文章

最新更新