我在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
我有一个带有“注销”操作链接的家庭控制器,但是我不确定如何表示“经理”文件夹(以及该级别的其他文件夹)。而且,除了我在route.MapRoute文件中实现的功能(如上所示)之外,我找不到(实际上,我还没有详尽搜索过)有关路由的现成文档。如果有人可以指引我正确的方向或告诉我使用正确的模式,我将不胜感激。我无法想象问题除了路由之外。谢谢!
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 });
}
}
}
答案 0 :(得分:0)
我看到两个选项供您定义适合您的路线。
第一个,如果您要注销特定文件夹中的所有用户,则可以使用以下路由。关键字“ allusers”可防止您与默认路由发生冲突。这也使您的路线更具“可读性”。
config.Routes.MapHttpRoute(
"LogOffAllUserFromFolder",
"{controller}/{action}/allusers/{folder}",
new { controller = "Home", action = "Logoff", folder = RouteParameter.Optional });
此端点将看起来像:
/home/logoff/allusers/Managers
第二,如果您要从“经理”文件夹中注销特定用户(例如ID为124的用户),则可以尝试以下与默认值不冲突的路由,因为有4个参数>
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+" }
由于{folder}是一个字符串,因此不需要任何其他定义,因为它是默认类型。
如果我误解了您的观点,希望这会给您有关如何声明MVC路由的提示。
保重。
答案 1 :(得分:0)
如果要在Controllers文件夹中使用属性路由,只需创建一个ManagersController
[RoutePrefix("managers")]
public class ManagerController
然后只需在控制器内部的每个函数上添加一个[Route("")]
属性。
根据需要的所有URL参数,在Route属性中定义它们。
[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中的通用catchmap maproute,您需要这样的东西:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional }
);
确保这是RouteConfig中定义的最后一条路由。
然后在ManagersController.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