从View访问RouteData.Values的最简单方法

Ben*_*kel 18 razor asp.net-mvc-3

我使用以下代码在我的视图中获取当前的"操作",因为我想基于它自定义构建actionlink.

ViewContext.RequestContext.RouteData.Values("action")
Run Code Online (Sandbox Code Playgroud)

我的最终目标是使用Javascript构建一些动作链接,并且.js需要知道当前控制器和动作是什么,因为我希望它具有灵活性.我通过浏览框架找到了上述内容,但我不知道我是否找到了正确的东西.

var routeData = ViewContext.RequestContext.RouteData;
var linkStub = '/@routeData.Values("controller")/@routeData.Values("action")';
Run Code Online (Sandbox Code Playgroud)

有谁知道这是最简单/最直接的方法吗?

max*_*ego 27

最干净的方式是扩展方法

public static class MyUrlHelper
{
    public static string CurrentAction(this UrlHelper urlHelper)
    {
        var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;
        // in case using virtual dirctory 
        var rootUrl = urlHelper.Content("~/");
        return string.Format("{0}{1}/{2}/", rootUrl, routeValueDictionary["controller"], routeValueDictionary["action"]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Nec*_*ros 13

你可以从中得到路线数据RequestContext,但实际上并不重要(有多种方法).我不担心经历多个对象(可能只需要几微秒).您可以通过创建扩展方法(例如url helper)或使有问题的控件继承自定义实现所需的WebViewPage快捷方式来使代码更好.像那样:

public abstract class MyWebViewPage<TModel> : WebViewPage<TModel>
{
    public string ControllerName
    {
        get
        {
            return Url.RequestContext.RouteData.Values["controller"].ToString();
        }
    }

    public string ActionName
    {
        get
        {
            return Url.RequestContext.RouteData.Values["action"].ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)