【问题标题】:What is the most efficient way to perform the reverse of Server.MapPath in an ASP.Net Application在 ASP.Net 应用程序中执行 Server.MapPath 反向的最有效方法是什么
【发布时间】:2008-12-28 03:45:51
【问题描述】:

我正在构建一个 MVC 应用程序,在该应用程序中,我正在从文件系统读取文件列表,并且我想将该文件的相对 URL 传递给视图,最好以“~/”为前缀,以便选择任何视图cab 适当地呈现 URL。

为此,我需要枚举文件系统中的文件并将它们的物理路径转换回相对 URL。我尝试过一些算法,但我担心效率和最小的字符串操作。另外,我相信 .Net Framework 中没有任何东西可以执行此操作,但是最新的 MVC 版本中是否有可以执行此操作的东西?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    目前我不知道有什么内置方法可以做到,但不难,我是这样做的:

    • 我们需要获取应用程序根目录,并在我们的新路径中将其替换为~
    • 我们需要将反斜杠转换为斜杠

    public string ReverseMapPath(string path)
    {
        string appPath = HttpContext.Current.Server.MapPath("~");
        string res = string.Format("~{0}", path.Replace(appPath, "").Replace("\\", "/"));
        return res;
    }
    

    【讨论】:

    • 我现在有类似的东西。我不喜欢在循环中为一堆枚举文件调用它,以及对 MapPath、String.Replace 和 String.Format 的所有调用。在优化方面,传入 appPath 可以消除对 MapPath 的调用。也许没有比这更好的了?!
    • 如果您关心性能,您可以让服务或其他东西监控带外目录,将路径转换为相对 url,将它们存储在某个地方,并使用该数据存储来获取 url 通过到视图。根据您拥有的文件数量,可能不值得麻烦。
    • 另请注意:如果您的文件名中有空格和其他字符需要编码,您可能希望在返回结果之前添加此行。 res = new Uri("http://localhost" + res).AbsolutePath;
    • 请注意,这不适用于网站内虚拟目录中指向根网站结构之外的文件。
    • 这个方法返回相对路径,如果需要绝对路径,把开头的“~”改成“..”
    【解决方案2】:

    这不就是 UrlHelper.Content 方法的作用吗? http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.content.aspx

    【讨论】:

    • 不,该辅助方法仅适用于虚拟路径。我希望采用底层物理路径并将其映射到 Web 应用程序的虚拟结构中。
    【解决方案3】:

    我做了一些挖掘,试图让 UrlHelper 类在控制器之外工作,然后我想起了一个在 aspx 页面中做同样事情的老技巧:

    string ResolveUrl(string pathWithTilde)
    

    希望这会有所帮助! 看: https://msdn.microsoft.com/en-us/library/system.web.ui.control.resolveurl(v=vs.110).aspx

    【讨论】:

    • 我无法弄清楚如何以一种有用的方式解释这一点......即使在问题的上下文之外。 -- 你给了我们一个方法签名,但没有关于它的实际信息 -- 这是我们应该知道的某个对象上的某个内置方法吗?
    • 你是对的,这不是一个简洁的答案。添加了更多信息的链接。使用 WebForms 时,在 ASPX 页面的代码隐藏中,可以使用 ResolveURL 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2023-03-09
    • 2011-01-12
    相关资源
    最近更新 更多