如何在不创建路由错误的情况下实现RouteConfig文件中的扩展路由的路由



我在ASP.NET MVC 5应用程序(C#)中实现了一个注销链接,并且它可以与我的应用程序的当前路由完美地工作:

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

当我登录时,我会看到注销按钮,并且它无缝工作。

但是,我有针对注册用户指定的其他领域(我尚未考虑该路由),然后去了为授权用户设计的区域,我尝试注销,我将获得以下内容当浏览器显示错误时返回路径:

/Managers/Home/LogOff

我有一个带有记录的操作链接的家庭控制器,但是我不确定如何代表我的经理文件夹(以及该级别上的其他文件夹)。而且我找不到(实际上,我还没有详尽地搜索过)随时可用的路由文档,超出了我在路由中实现的内容。如果有人可以将我引导到正确的方向或告诉我正确使用的模式,我将不胜感激。我无法想象这个问题除了路由之外。谢谢!

RouteConfig.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace HRCoreUS
{
using System.Web.UI.WebControls;
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Login", id = UrlParameter.Optional });
        }
    }
}

我看到了两个选项供您定义适合您的路由。

fist One,如果您想从特定文件夹中注销所有用户,则可以使用以下路由。关键字的"钓鱼器"使您与默认路线发生冲突。这也使您的路线更加"可读"。

config.Routes.MapHttpRoute(
    "LogOffAllUserFromFolder",
    "{controller}/{action}/allusers/{folder}",
    new { controller = "Home", action = "Logoff", folder = RouteParameter.Optional });

然后,此端点看起来像:

/home/logoff/allusers/Managers
第二个P>
config.Routes.MapHttpRoute(
    "LogOffSpecificUserFromFolder",
    "{controller}/{action}/{id}/{folder}",
    new { controller = "Home", action = "Logoff", id = RouteParameter.Optional, folder = RouteParameter.Optional },
    new { id = @"d+" });

然后,端点看起来像

/home/logoff/124/Managers

我想是ID是一个INT,您可以通过将其添加到您的路线定义

来告诉它。
new { id = @"d+" }

at as {文件夹}是一个字符串,您不需要任何其他定义,因为它是默认类型。

如果我错过了您的意思,希望这将为您提供有关如何声明MVC路线的提示。

注意。

如果要在控制器文件夹中使用属性路由,请简单地创建一个ManagersController

[RoutePrefix("managers")]
public class ManagerController

然后,只需在控制器内部的每个功能上添加[Route("")]属性即可。根据您需要在路由属性中定义它们的任何URL参数。

[HttpGet, Route("logoff}")]
public HttpResponseMessage LogOff() //route would be Managers/logoff
[HttpGet, Route("{id:int/view-profile}")]
public HttpResponseMessage ViewProfile(int id) //route would be Managers/4/view-profile
[HttpPost, Route("{id:guid/save-profile}")]
public HttpResponseMessage ViewProfile(Guid id) //route would be Managers/405750C8-0B3F-4EF2-A2A2-17A1EFBCDA39/save-profile

有关属性的更多信息 - https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

或对于RouteConfig中的一般Catchall MapRoute,您需要这样的东西:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { action = "Index", id = UrlParameter.Optional }
    );

确保这是您的RouteConfig中定义的最后一个路线。

然后在ManagerersController.cs中创建

public HttpResponseMessage LogOff()

此路线将是localhost.com/managers/logoff

但是,从我如何解释您的问题来看,您的身份验证逻辑似乎与特定的控制器(家庭)相关联?您应该将所有这些逻辑封装在可以处理您的登录/登录逻辑的authenticationController之类的东西中。这样,它不取决于其他任何东西,您可以有这样的路线:

    routes.MapRoute(
        name: "Authentication",
        url: "authentication/{action}",
        defaults: new { controller = "Authentication", action = "Index"}
    );

带有登录/记录功能。这些将路由到/authentication/login/authentication/logoff

最新更新