如何在 ASP.NET Core 中获取 Web 根路径和内容根路径?

Posted

技术标签:

【中文标题】如何在 ASP.NET Core 中获取 Web 根路径和内容根路径?【英文标题】:How do I get the Web Root Path and the Content Root Path in ASP.NET Core? 【发布时间】:2018-08-22 17:11:18 【问题描述】:

我正在尝试在视图中添加根路径作为参数,因此我可以将其作为参数传递给 PayPal 按钮。

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
    ... snip ...

    <input type="hidden" name="return" value="@Model.UrlRoot/Manage/Subscription?userId=@Model.User.Id">

    ... snip ...
</form>

我正在筛选答案 How can I get my webapp's base URL in ASP.NET MVC? (20 个回答) 和 ASP.NET MVC 6 application's virtual application root path

由于 ASP.NET Core 完全不同,Request 类不再包含 .Url 属性,因此这些答案中的大多数都不起作用。

【问题讨论】:

【参考方案1】:

您可以像这样将 IHostingEnvironment 注入到控制器中:

   public class HomeController : Controller
    
        protected readonly IHostingEnvironment _hostingEnvironment;

        public HomeController(IHostingEnvironment hostingEnvironment)
        

        
    

在你的 _ViewImports.cshtml 添加:

@using Microsoft.AspNetCore.Hosting
@inject IHostingEnvironment HostingEnvironment

现在您可以在表单中使用 HostingEnvironment 及其所有属性。 例如HostingEnvironment.WebRootPathHostingEnvironment.ContentRootPath

【讨论】:

如果您只想在视图中使用它,则不必将 IHostingEnvironment 注入控制器。如果您希望它在任何视图中可用,则将 IHostingEnvironment 注入 _ViewImports 是有意义的。如果您只需要在单个视图中使用它,则可以将其直接注入到该视图中。 对于 asp.net core 3.1 及更高版本,使用 IWebHostEnvironment 代替 IHostingEnvironment【参考方案2】:

我看到了 Marius Schulz 的帖子。 (如果你是 Marius,请添加你的答案,联系我,我会删除我的。)

https://blog.mariusschulz.com/2016/05/22/getting-the-web-root-path-and-the-content-root-path-in-asp-net-core

由于某种原因,我的控制器没有在构造函数中注入 IHostingEnvironment,但它们确实有 Request 对象。

在我的控制器中,我已经声明了

var urlRoot = $"Request.Scheme://Request.HostUrl.Content("~")";

并将其传递给 MyViewModel

var model = new MyViewModel  UrlRoot = urlRoot ;
return View(model);

这会考虑到 http 与 https、端口号,如果网站不是以 / 为根,则希望是网站根。由于我的站点位于 / 我无法确认 Url.Content("~") 获取站点根目录。

【讨论】:

【参考方案3】:

在 .NET core 2.1 中,上下文会自动注入到视图中。 显示视图的请求的基本路径可以这样访问:

@(Context.Request.PathBase)

【讨论】:

【参考方案4】:

在 net core 5 razor 页面中,我在页面顶部添加了以下内容:

@inject IHostEnvironment hostEnvironment

然后在我的代码中,我成功地使用了以下代码:

string filePath = $@" hostEnvironment.ContentRootPath \wwwroot\assets\img\users\ user.ID .jpg";

    if (System.IO.File.Exists(filePath))
    
        imageURL = $" user.ID .jpg";
    

【讨论】:

以上是关于如何在 ASP.NET Core 中获取 Web 根路径和内容根路径?的主要内容,如果未能解决你的问题,请参考以下文章