我想为管理/身份验证的控制器和视图中的公共/匿名控制器和视图提供一些URL分隔。所以我最终完全使用Attribute Routing来更好地控制我的网址。我希望我的公共URL以“〜/ Admin / etc”开头。而我的公共网址没有任何这样的前缀。
[RoutePrefix("Home")]
public class HomeController : Controller
{
[Route("Index")]
public ActionResult Index()
{ //etc. }
}
[RoutePrefix("Admin/People")]
public class PeopleController : Controller
{
[Route("Index")]
public ActionResult Index()
{ //etc. }
}
这允许我拥有公共网址,例如:
http://myapp/home/someaction
...以及管理员/身份验证的网址,例如:
http://myapp/admin/people/someaction
但是现在我想根据用户是在网站的“管理”部分还是“公共”部分,在视图中做一些动态的东西。如何正确地以编程方式访问?
我知道我可以做类似
的事情if (Request.Url.LocalPath.StartsWith("/Admin"))
......但感觉“很丑”。我知道我可以通过
访问控制器和动作名称HttpContext.Current.Request.RequestContext.RouteData.Values
...但是“admin”片段没有反映在那里,因为它只是一个路由前缀,而不是一个实际的控制器名称。
因此,基本问题是,如何以编程方式确定当前加载的视图是否在“admin”部分下?
答案 0 :(得分:8)
您只需要反映RoutePrefixAttribute
类型中的Controller
,然后获取其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;
}
}
然后在您的视图中,您只需调用扩展方法即可获取RoutePrefixAttribute
的值。
@Html.GetRoutePrefix() // Returns "Admin/People"