首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC 5-如何在httpErrors中更改路由?

ASP.NET MVC 5-如何在httpErrors中更改路由?
EN

Stack Overflow用户
提问于 2016-06-03 10:44:41
回答 1查看 837关注 0票数 1

我试图以这种方式处理MVC5站点中的HTTP错误:

web.config:

代码语言:javascript
复制
<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <clear/>
      <error statusCode="403" path="/language/Error/Details/403" responseMode="ExecuteURL"/>
      <error statusCode="404" path="/language/Error/Details/404" responseMode="ExecuteURL"/>
      <error statusCode="500" path="/language/Error/Details/500" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

ErrorController.cs:

代码语言:javascript
复制
// GET: Error/Details
public ActionResult Details()
{
    /* Setting the language for the errors since it is not possible to handle multi-language errors in the web.config file where the errors are redirected */
    if (!CultureHelper.cultures.Contains(base.culture))
    {
        RouteData.Values["culture"] = CultureHelper.GetCurrentNeutralCulture();
    }

    /* Redirecting uncontrolled errors to 404 error */
    if (RouteData.Values["statusCode"] == null)
    {
        return RedirectToRoute(new { culture = base.culture, controller = "Error", action = "Details", statusCode = 404 });
    }

    /* Preparing the model */
    ErrorViewModel error = ErrorFactory.Create(Convert.ToInt32(RouteData.Values["statusCode"]));


    /* Preparing the view */
    base.SetLanguageFromRoute();

    return View(error);
}

RouteConfig.cs:

代码语言:javascript
复制
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{culture}/{controller}/{action}/{id}",
        defaults: new { culture = CultureHelper.GetCurrentNeutralCulture(), controller = "User", action = "Home", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: null,
        url: "{culture}/Error/Details/{statusCode}",
        defaults: new { culture = CultureHelper.GetCurrentNeutralCulture() }
    );
}

我的问题是,当细节获取操作被调用时,一旦它到达这一行:

代码语言:javascript
复制
if (RouteData.Values["statusCode"] == null)

它总是返回true,因为RouteData中没有“RouteData”键,因为它使用的是默认路由而不是错误路由,并且statusCode在路由中传递的名称为"id“(默认路由键)。

我知道我可以使用默认的路由并从ID中捕获状态代码,但是我有一个自定义路由,用于在执行RedirectToRoute时从其他控制器获取错误,所以我想在这里使用它。有没有办法告诉<httpErrors>,我想使用与默认路由不同的路由?

EN

回答 1

Stack Overflow用户

发布于 2016-06-08 14:27:34

有什么方法可以告诉我要使用与默认路径不同的路径吗?

是。有两种方法。

最明智的方法是使用put specific routes before general routes,这样在路由表中就不会有不可访问的执行路径。这将确保您的传入URL被定向到正确的控制器。

这意味着您需要将更具体的自定义路由放在默认路由之前,以便首先检查它。

代码语言:javascript
复制
public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Error",
            url: "{culture}/Error/Details/{statusCode}",
            defaults: new { culture = CultureHelper.GetCurrentNeutralCulture() }
        );

        routes.MapRoute(
            name: "Default",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { culture = CultureHelper.GetCurrentNeutralCulture(), controller = "User", action = "Home", id = UrlParameter.Optional }
        );
    }

另一种方法是在调用RedirectToRouteResult时指定路由名称。请注意,您没有给您的路由命名(它是空的),所以您没有办法这样做,除非您像我上面那样命名它。

代码语言:javascript
复制
return RedirectToRoute(
    routeName: "Error", 
    routeValues: new { culture = base.culture, controller = "Error", action = "Details", statusCode = 404 });

这将使您重定向到正确的URL,但可能仍然无法工作,因为当访问URL时,它仍然会进入您的“默认”路由,因为它与此URL匹配,并且是首先注册的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37612307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档