47

如何解析相对于 ASP.NET MVC 4 应用程序根目录的路径?也就是说,我想从控制器操作中打开属于应用程序的文件,引用如~/Data/data.html. 这些路径通常在Web.config.

编辑:

通过“解决”,我的意思是将相对于应用程序根目录的路径转换为绝对路径,例如~/Data/data.htmlC:\App\Data\Data.html

4

5 回答 5

85

要获取绝对路径,请使用以下命令:

String path = HttpContext.Current.Server.MapPath("~/Data/data.html");

编辑:

.Current从上面的行中删除控制器的上下文。通过单独使用HttpContext它更容易测试,因为它基于控制器的上下文,因此更加本地化。

我现在意识到我不喜欢Server.MapPath工作方式(内部最终调用HostingEnvironment.MapPath)所以我现在建议总是使用HostingEnvironment.MapPath它,因为它是静态的而不依赖于上下文,除非你当然想要......

于 2012-09-02T19:30:52.823 回答
64

当我需要控制器之外的路径时,我发现此代码很有用,例如当我在 Global.asax.cs 中初始化组件时:

HostingEnvironment.MapPath("~/Data/data.html")
于 2013-03-26T21:20:25.093 回答
15

只需使用以下

Server.MapPath("~/Data/data.html")
于 2013-01-28T21:07:44.680 回答
4

在操作中,您可以调用:

this.Request.PhysicalPath

返回参考当前控制器的物理路径。如果您只需要根路径调用:

this.Request.PhysicalApplicationPath
于 2012-09-02T19:30:10.410 回答
1

在您的控制器中使用:

var path = HttpContext.Server.MapPath("~/Data/data.html");

这允许您使用 Moq 测试控制器,如下所示:

var queryString = new NameValueCollection();
var mockRequest = new Mock<HttpRequestBase>();
mockRequest.Setup(r => r.QueryString).Returns(queryString);
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Setup(c => c.Request).Returns(mockRequest.Object);
var server = new Mock<HttpServerUtilityBase>();
server.Setup(m => m.MapPath("~/Data/data.html")).Returns("path/to/test/data");
mockHttpContext.Setup(m => m.Server).Returns(server.Object);
var mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(c => c.HttpContext).Returns(mockHttpContext.Object);
var controller = new MyTestController();
controller.ControllerContext = mockControllerContext.Object;
于 2018-06-21T15:42:42.857 回答