我在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