gpt4 book ai didi

c# - HandleError 和 ASP.MVC 中的强类型布局

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:42 27 4
gpt4 key购买 nike

我正在使用 ASP.MVC 4。我有一个连接到基本 View 模型的强类型布局(每个其他 View 模型都继承自基本 View 模型)。我正在尝试使用标准的 HandleError 过滤器来处理错误。如果布局不是强类型的,它是开箱即用的配置并且可以工作。

我的示例异常如下:

public class TestController : Controller
{
public ActionResult Index()
{
throw new Exception("oops");
}
}

当该机制试图将错误页面插入强类型布局时,它会遇到麻烦,因为没有适合它的模型。

有谁知道将强类型布局与 HandleError 过滤器一起使用的场景是什么?是否有可能在抛出异常之前为布局设置模型?

编辑:

可能的解决方案是关闭标准错误处理机制并在 Global.asax 的 Application_Error 方法中捕获异常。您可以在此处找到示例解决方案:ASP.MVC HandleError attribute doesn't work

无论如何 - 如果有人有其他解决方案,请发布。

最佳答案

您可以编写自己的 HandleError 属性并将其注册到 FilterConfig 而不是默认属性。您的自定义将扩展默认属性,覆盖结果,以便传递到 View 的模型实例是所需的类型:

public class CustomHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
//When already handled, do nothing
if (context.ExceptionHandled)
return;

//Run the base functionality
base.OnException(context);

//If the base functionality didnt handle the exception, then exit (as the exception is not of the type this filter should handle)
if (!context.ExceptionHandled) return;

//Set a view as the result
context.Result = GetViewResult(context);
}

private ViewResult GetViewResult(ExceptionContext context)
{
//The model of the error view (YourModelType) will inherit from the base view model required in the layout
YourModelType model = new YourModelType(context.Exception, ...);
var result = new ViewResult
{
ViewName = View,
ViewData = new ViewDataDictionary<YourModelType>(model),
TempData = context.Controller.TempData
};
return result;
}
}

然后全局注册这个过滤器而不是默认的HandleErrorAttribute:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomHandleErrorAttribute());
...
}

关于c# - HandleError 和 ASP.MVC 中的强类型布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com