如何在 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 根路径和内容根路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core Web API 中使用 LINQ 仅从数据库中获取最新的 id?

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值

以编程方式在我的 ASP .net Core Web API 中获取 TFS 工作项详细信息?

如何在 ASP.NET Core MVC 中请求和显示实时 Web api 数据?

如何在 asp.net core 2.1 中使用 net.tcp 服务

ASP.NET Core 3.1 - 如何获取客户端的 IP 地址?