如何在asp.net mvc中以编程方式确定Route Prefix?

Jiv*_*man 5 c# asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5

我想为管理/身份验证的控制器和视图中的公共/匿名控制器和视图提供一些URL分隔.所以我最终完全使用属性路由,以便更好地控制我的URL.我希望我的公共URL以"〜/ Admin/etc"开头.而我的公共网址没有任何这样的前缀.

公共控制员(几个中的一个)

[RoutePrefix("Home")]
public class HomeController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    { //etc. }
}
Run Code Online (Sandbox Code Playgroud)

管理员控制器(几个之一)

[RoutePrefix("Admin/People")]
public class PeopleController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    { //etc. }
}
Run Code Online (Sandbox Code Playgroud)

这允许我拥有公共URL,例如:

http://myapp/home/someaction
Run Code Online (Sandbox Code Playgroud)

...以及admin/authenticated URL,例如:

http://myapp/admin/people/someaction
Run Code Online (Sandbox Code Playgroud)

但是现在我想根据用户是在网站的"管理"部分还是"公共"部分,在视图中做一些动态的东西.如何正确地以编程方式访问?

我知道我可以做点什么

if (Request.Url.LocalPath.StartsWith("/Admin"))
Run Code Online (Sandbox Code Playgroud)

......但感觉"很丑".我知道我可以通过访问控制器和动作名称

HttpContext.Current.Request.RequestContext.RouteData.Values
Run Code Online (Sandbox Code Playgroud)

...但是"admin"部分没有反映在那里,因为它只是一个路由前缀,而不是一个实际的控制器名称.

所以,基本的问题是,如何以编程方式确定当前加载的视图是否在"admin"部分下?

Nig*_*888 9

你只需要以反映RoutePrefixAttributeController类型,然后得到它的Prefix价值.该Controller实例可用于ViewContext.

此示例创建一个方便的HTML帮助程序,将所有步骤包装到单个调用中.

using System;
using System.Web.Mvc;

public static class RouteHtmlHelpers
{
    public static string GetRoutePrefix(this HtmlHelper helper)
    {
        // Get the controller type
        var controllerType = helper.ViewContext.Controller.GetType();

        // Get the RoutePrefix Attribute
        var routePrefixAttribute = (RoutePrefixAttribute)Attribute.GetCustomAttribute(
            controllerType, typeof(RoutePrefixAttribute));

        // Return the prefix that is defined
        return routePrefixAttribute.Prefix;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您只需要调用扩展方法来获取值的RoutePrefixAttribute.

@Html.GetRoutePrefix() // Returns "Admin/People"
Run Code Online (Sandbox Code Playgroud)