如何从帮助器内部获取asp.net核心中的server.MapPath

时间:2016-07-20 14:24:19

标签: asp.net-core

有这样的辅助方法:

 public static IHtmlContent Source(this IHtmlHelper html, string s)
 {
     var path = ServerMapPath() + "Views\\" + s;

我需要在asp.net核心

中获得相当于Server.MapPath的功能

3 个答案:

答案 0 :(得分:5)

您需要注入IHostingEnvironment。然后:

var path = env.ContentRootPath + "Views\\" + s;

在html帮助器中,你可以这样做:

((IHostingEnvironment)html.ViewContext.HttpContext.RequestServices.GetService(typeof(IHostingEnvironment))).ContentRootPath;

答案 1 :(得分:1)

推荐的解决方案

推荐不要使用静态类。您可以保留与您的班级相似的内容,并将其注册为单身人士。

public class SourceClass
{
    private readonly IWebHostEnvironment _webHostEnvironment;

    public SourceClass (IWebHostEnvironment webHostEnvironment)
    {
         _webHostEnvironment= webHostEnvironment;
    }

    private IHtmlContent Source(this IHtmlHelper html, string s)
    {
        string contentRootPath = _webHostEnvironment.ContentRootPath;
        Path.Combine(contentRootPath,"Views",s)
    }
}

然后,在Startup.ConfigureServices中:

services.AddSingleton<SourceClass>();

最后,在需要的地方插入SourceClass,而不仅仅是静态地引用该类。


另一种解决方案

注意:@regna应该提供此解决方案,但它有一些缺点,我认为可以完全解决

但是,如果您想使用静态方法,则可以这样做(注意:在 .Net Core 3 中,IHostingEnvironment是绝对的,必须使用IWebHostEnvironment来代替):< / p>

  • 用于 ServerPath ,使用

    ((IWebHostEnvironment)html.ViewContext.HttpContext.RequestServices.GetService(typeof(IWebHostEnvironment))).ContentRootPath
    

OR

  • 用于 WebRootPath(wwwroot),请使用

    ((IWebHostEnvironment)html.ViewContext.HttpContext.RequestServices.GetService(typeof(IWebHostEnvironment))).WebRootPath
    

在此answer中,您可以找到更多详细信息。


我也建议您使用此代码:

var path = Path.Combine(WebRootPath,"Views",s)

代替

var path = WebRootPath + "Views\\" + s

在所有操作系统上运行代码。

答案 2 :(得分:-1)

要获得完整的解决方案(MapPath(), IsPathMapped(), UnmapPath()),请查看我对此问题的回答:Reading a file in MVC 6