加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC – 出错时的声明性重定向

发布时间:2020-12-16 06:30:29 所属栏目:asp.Net 来源:网络整理
导读:我一直在捕获异常并将用户重定向到错误页面.我传递了异常消息和返回URL,告诉用户发生了什么,并允许他们返回另一个页面. try { return action(parameters); } catch (Exception exception) { ErrorViewModel errorModel = new ErrorViewModel(); errorModel.E
我一直在捕获异常并将用户重定向到错误页面.我传递了异常消息和返回URL,告诉用户发生了什么,并允许他们返回另一个页面.

try
        {
            return action(parameters);
        }
        catch (Exception exception)
        {
            ErrorViewModel errorModel = new ErrorViewModel();
            errorModel.ErrorMessage = "An error occured while doing something.";
            errorModel.ErrorDetails = exception.Message;
            errorModel.ReturnUrl = Url.Action("Controller","Action");
            return RedirectToAction("Index","Error",errorModel);
        }

这似乎是太多的代码来包装每个动作.我正在使用全局过滤器来处理错误:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        HandleErrorAttribute attribute = new HandleErrorAttribute();
        filters.Add(attribute);
    }

我有我的web.config设置如下:

<customErrors mode="On" defaultRedirect="~/Error/Unknown">

但是,这仅适用于未处理的异常.

我希望异常导致重定向到错误控制器/操作,并获取包含异常详细信息的参数.如果我可以逐个动作地指示返回URL,或者如果没有提供默认值,则会很好.

解决方法

这是我创建的一个小的RedirectOnErrorAttribute类:

using System;
using System.Web.Mvc;
using MyApp.Web.Models;

namespace MyApp.Web.Utilities
{
    public class RedirectOnErrorAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// Initializes a new instance of a RedirectOnErrorAttribute.
        /// </summary>
        public RedirectOnErrorAttribute()
        {
            ErrorMessage = "An error occurred while processing your request.";
        }

        /// <summary>
        /// Gets or sets the controller to redirect to.
        /// </summary>
        public string ReturnController { get; set; }

        /// <summary>
        /// Gets or sets the action to redirect to.
        /// </summary>
        public string ReturnAction { get; set; }

        /// <summary>
        /// Gets or sets the error message.
        /// </summary>
        public string ErrorMessage { get; set; }

        /// <summary>
        /// Redirects the user to an error screen if an exception is thrown.
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Exception != null && !filterContext.ExceptionHandled)
            {
                ErrorViewModel viewModel = new ErrorViewModel();
                viewModel.ErrorMessage = ErrorMessage;
                viewModel.ErrorDetails = filterContext.Exception.Message;
                string controller = ReturnController;
                string action = ReturnAction;
                if (String.IsNullOrWhiteSpace(controller))
                {
                    controller = (string)filterContext.RequestContext.RouteData.Values["controller"];
                }
                if (String.IsNullOrWhiteSpace(action))
                {
                    action = "Index";
                }
                UrlHelper helper = new UrlHelper(filterContext.RequestContext);
                viewModel.ReturnUrl = helper.Action(action,controller);
                string url = helper.Action("Index",viewModel);
                filterContext.Result = new RedirectResult(url);
                filterContext.ExceptionHandled = true;
            }
            base.OnActionExecuted(filterContext);
        }
    }
}

现在,我可以像这样装饰我的所有动作:

[RedirectOnError(ErrorMessage="An error occurred while doing something.",ReturnController="Controller",ReturnAction="Action")]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读