如何解析相对于ASP.NET MVC 4应用程序根目录的路径?

时间:2012-09-02 19:20:59

标签: c# asp.net-mvc

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

修改

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

5 个答案:

答案 0 :(得分:77)

要获得绝对路径,请使用:

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

编辑:

要获取Controller的上下文,请从上一行中删除.Current。通过单独使用HttpContext,它更容易测试,因为它基于Controller的Context因此更加本地化。

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

答案 1 :(得分:55)

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

HostingEnvironment.MapPath("~/Data/data.html")

答案 2 :(得分:12)

只需使用以下

即可
Server.MapPath("~/Data/data.html")

答案 3 :(得分:4)

在您可以致电的操作中:

this.Request.PhysicalPath

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

this.Request.PhysicalApplicationPath

答案 4 :(得分:0)

在您的控制器中使用:

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;