首页 > 解决方案 > ASP.NET MVC 中带有查询字符串的 Server.MapPath

问题描述

在 Goooooogling 大约 15 分钟后,我找不到这个简单问题的解决方案。所以有点帮助?

该应用程序托管在web网站的子文件夹中,我需要映射一个相对 Uri(这是一个将 int 和一个字符串作为参数的Hello操作):RouteController

"~/Route/Hello/129?name=kennyzx"

http://myserver/web/myapplication/Route/Hello/129?name=kennyzx

如果我使用

HttpContext.Current.Server.MapPath("~/Route/Hello/129?name=kennyzx");

它抛出异常,因为问号?是非法字符。

所以我需要先将 Uri 分成两部分~/Route/Hello/129?name=kennyzx然后MapPath取第一部分,并将Path.Combine结果MapPath与​​查询字符串连接起来。

有没有更简单的方法来做到这一点?

我意识到我使用了错误的 API,它实际上扩展到了我服务器上的真实文件路径!

这就是我想要做的:

我有一堆相对 uris,我想在 Razor 页面中编写一个函数将它们扩展为绝对 uris。

@{
    ViewBag.Title = "Route Testing";
    var link1 = "/Route/Hello/129?name=kennyzx";
    var link2 = "~/Route/Hello/129?name=kennyzx";
}

@functions{
    private static string GetAbsoluteUri(string link)
    { 
        string absoluteUri = HttpContext.Current.Server.MapPath(link);
        return absoluteUri;
    }
}

<h2>Route Testing</h2>

<a href="@link1">@link1</a><br />
<a href="@link2">@link2</a><br />
<a href="@GetAbsoluteUri(@link2)">@link2</a><br />

但以上都没有得到正确的绝对路径。

第一个扩展为http://myserver/Route/Hello/129?name=kennyzx

第二个扩展为http://myserver/web/myapplication/~/Route/Hello/129?name=kennyzx

第三个抛出异常,这就是我问这个问题的原因。

标签: c#asp.net-mvcuriserver.mappath

解决方案


Server.MapPath返回服务器上的实际路径,如file:///C:/somefolder/somefile. 它不用于解析相对 url。

原来我正在寻找的是@Url.Content来解析 Razor 页面中的相对 url。

@{
    ViewBag.Title = "Route Testing";
    var link1 = "~/Route/Hello/129?name=kennyzx";
}

<h2>Route Testing</h2>

<a href="@Url.Content(@link1)">@link1</a><br />

推荐阅读