【问题标题】:Controller Path in ASP.NET-MVCASP.NET-MVC 中的控制器路径
【发布时间】:2009-04-21 17:55:46
【问题描述】:

如何获取控制器的路径?例如,我可以像这样获取 HtmlHelper 的路径:

    private static string GetVirtualPath(HtmlHelper htmlhelper)
    {
        string virtualPath = null;
        TemplateControl tc = htmlhelper.ViewDataContainer as TemplateControl;

        if (tc != null)
        {
            virtualPath = tc.AppRelativeVirtualPath;
        }

        return virtualPath;
    }

【问题讨论】:

    标签: asp.net-mvc path controller


    【解决方案1】:

    编辑:以下将给出带有控制器的程序集的路径以及带有控制器动作的类的类型名称。也许这些的组合会给你你所追求的东西,Aaron?

    string assemblyPath = Assembly.GetExecutingAssembly().CodeBase;
    string typeName = this.GetType().FullName;
    

    例如,它们会产生类似的东西

    file:///C:/Projects/TestApp/TestApp.UI/bin/TestApp.UI.DLL
    TestApp.UI.Controllers.TestController
    

    如果您以“标准”的 ASP.NET MVC 方式放置和命名控制器,上述的某种组合可能会为您提供 C# 文件的正确完整路径:

    C:/Projects/TestApp/TestApp.UI/Controllers/TestController.cs
    

    或相对路径:

    Controllers/TestController.cs
    

    以下将给出控制器动作的路由:

    1) string path = Request.Url.AbsolutePath
    
    2) string appPath = Request.ApplicationPath;
       string absPath = Request.Url.AbsolutePath;
       string path = appPath.Length <= 1 ? 
           absPath : absPath.Replace(appPath, "");
    

    TestController 的 Index 操作请求示例 (http://localhost:50027/Test/Index):以上返回

    1) /Test/Index
    2) /Test/Index
    

    对于基本 url 为 http://localhost:50027/blog 的网站,例如请求 TestController 的索引操作 (http://localhost:50027/blog/Test/Index):以上返回

    1) /blog/Test/Index
    2) /Test/Index
    

    【讨论】:

      【解决方案2】:

      您使用的方法将返回 View 的相对 aspx 文件名 - 这并不是 HtmlHelper 的真正位置。

      当你说你想要一个控制器的路径时,你实际上是什么意思?您的控制器是在某处的程序集中编译的类。您想获取 Controller 的源 .cs 文件的位置吗?还是有什么不同?

      【讨论】:

        【解决方案3】:

        你可以这样获取控制器的名字

        Url.RequestContext.RouteData.Values["controller"]
        

        获取控制器名后可以使用方法解析路径

        ResolveClientUrl("~/<ControllerName>") 
        

        【讨论】:

        • 您不应该手动构建这样的 URL...如果必须,请使用 RouteTable.Routes 将其通过路由。
        【解决方案4】:

        Aaron,听起来你在写一个 quine,嘿,但我想这是为了一些单元测试脚手架之类的?也许您真的想为您正在做的一些事情使用构建脚本?您可以在项目的属性页面中放置一些命令,这些命令在构建时在您的控制器目录上执行一些进程?抱歉,如果这根本不是您想要做的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-09
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          • 1970-01-01
          • 2013-09-29
          • 1970-01-01
          相关资源
          最近更新 更多