名称 'HttpContext' 在 Razor 的当前上下文中不存在
The name 'HttpContext' does not exist in the current context in Razor
我在这里感觉有点傻,因为我已经为此工作了几个小时。
我有一个简单的 Razor 页面,我想在其中检查文件是否存在。当我使用 "HttpContext.Current.Server.MapPath" 和 运行 页面时,我得到 "HttpContext does not exist"-error.
我也尝试了 HostingEnvironment.MapPath(在注释行中可见,使用 System.Web.Hosting),但这也不起作用。这对我来说都是全新的,所以可能是我遗漏了一些东西。据我所知,引用了正确的库。
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
@model IEnumerable<SensorView>
@using System.IO;
@using System.Web;
<div class="container-fluid">
<div class="row">
@{
if (Model != null)
{
foreach (SensorView sensor in Model)
{
<div class="col-sm-6 col-lg-4">
<div class="thumbnail">
@{
@*<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />*@
var absolutePath = HttpContext.Current.Server.MapPath(string.Format("~{0}.jpg", sensor.Image));
//var absolutePath = HostingEnvironment.MapPath(string.Format("~{0}.jpg", sensor.Image));
if (File.Exists(absolutePath))
{
<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />
}
else
{
<img src="@Url.Content(@"images/sensoren/320x150.png")" alt="@sensor.Image" class="sensor-image" />
}
}
<div class="caption">
<h4>
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" role="link">@sensor.Title</a>
</h4>
<p>
@sensor.DescriptionShort
</p>
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" class="btn btn-info _trMoreInformation" role="button">@Localizer["MoreInformation"]</a>
</div>
</div>
</div>
}
}
}
</div>
</div>
我认为这很简单,但如前所述,我已经为此工作了几个小时,但没有任何进展。
可能是天气炎热 ;-)
无论如何,我尝试帮助检查文件是否存在,如果不存在则显示默认图像。
感谢任何帮助。
[更新]
项目结构如下图所示
我最终得到了以下代码。这对我有用。
@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment HostingEnvironment
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
@model IEnumerable<SensorView>
@using System.IO;
@using System.Web;
<div class="container-fluid">
<div class="row">
@{
if (Model != null)
{
foreach (SensorView sensor in Model)
{
<div class="col-sm-6 col-lg-4">
<div class="thumbnail">
@{
@*<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />*@
if (HostingEnvironment.ContentRootFileProvider.GetFileInfo(string.Format("wwwroot{0}.jpg", sensor.Image)).Exists)
{
<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />
}
else
{
<img src="@Url.Content(@"/images/sensoren/320x150.png")" alt="@sensor.Image" class="sensor-image" />
}
}
<div class="caption">
<h4 style="min-height:40px;">
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" role="link">@sensor.Title</a>
</h4>
<div style="min-height:80px;">
<p>
@sensor.DescriptionShort
</p>
</div>
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" class="btn btn-info _trMoreInformation" role="button">@Localizer["MoreInformation"]</a>
</div>
</div>
</div>
}
}
}
</div>
</div>
我认为正确的语法是:
var absolutePath = Context.Server.MapPath(string.Format("~{0}.jpg", sensor.Image));
也许this document可以帮助您找到最合适的方法。
- 如果您使用的是 Razor Pages Web 应用程序,您错过了
@page
并且需要在 cshtml 文件顶部添加 @page
指令以使其编译为 class 继承间接来自 IRazorPage 。结果,您将拥有一个 HttpContext 属性 .
- 要得到一个
HostingEnvironment
,你可以通过@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment HostingEnvironment
注入它,因此你可以通过ContentRootFileProvider.GetFileInfo(subfilepath).Exists
检查文件是否存在。
- 提醒一下,如果您想在项目的根路径下提供静态文件,请不要忘记
UseStaticFiles(staticFileOpts)
。
我在这里感觉有点傻,因为我已经为此工作了几个小时。
我有一个简单的 Razor 页面,我想在其中检查文件是否存在。当我使用 "HttpContext.Current.Server.MapPath" 和 运行 页面时,我得到 "HttpContext does not exist"-error.
我也尝试了 HostingEnvironment.MapPath(在注释行中可见,使用 System.Web.Hosting),但这也不起作用。这对我来说都是全新的,所以可能是我遗漏了一些东西。据我所知,引用了正确的库。
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
@model IEnumerable<SensorView>
@using System.IO;
@using System.Web;
<div class="container-fluid">
<div class="row">
@{
if (Model != null)
{
foreach (SensorView sensor in Model)
{
<div class="col-sm-6 col-lg-4">
<div class="thumbnail">
@{
@*<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />*@
var absolutePath = HttpContext.Current.Server.MapPath(string.Format("~{0}.jpg", sensor.Image));
//var absolutePath = HostingEnvironment.MapPath(string.Format("~{0}.jpg", sensor.Image));
if (File.Exists(absolutePath))
{
<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />
}
else
{
<img src="@Url.Content(@"images/sensoren/320x150.png")" alt="@sensor.Image" class="sensor-image" />
}
}
<div class="caption">
<h4>
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" role="link">@sensor.Title</a>
</h4>
<p>
@sensor.DescriptionShort
</p>
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" class="btn btn-info _trMoreInformation" role="button">@Localizer["MoreInformation"]</a>
</div>
</div>
</div>
}
}
}
</div>
</div>
我认为这很简单,但如前所述,我已经为此工作了几个小时,但没有任何进展。
可能是天气炎热 ;-)
无论如何,我尝试帮助检查文件是否存在,如果不存在则显示默认图像。
感谢任何帮助。
[更新]
项目结构如下图所示
我最终得到了以下代码。这对我有用。
@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment HostingEnvironment
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
@model IEnumerable<SensorView>
@using System.IO;
@using System.Web;
<div class="container-fluid">
<div class="row">
@{
if (Model != null)
{
foreach (SensorView sensor in Model)
{
<div class="col-sm-6 col-lg-4">
<div class="thumbnail">
@{
@*<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />*@
if (HostingEnvironment.ContentRootFileProvider.GetFileInfo(string.Format("wwwroot{0}.jpg", sensor.Image)).Exists)
{
<img src="@Url.Content(string.Format("~{0}.jpg", sensor.Image))" alt="@sensor.Image" class="sensor-image" />
}
else
{
<img src="@Url.Content(@"/images/sensoren/320x150.png")" alt="@sensor.Image" class="sensor-image" />
}
}
<div class="caption">
<h4 style="min-height:40px;">
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" role="link">@sensor.Title</a>
</h4>
<div style="min-height:80px;">
<p>
@sensor.DescriptionShort
</p>
</div>
<a asp-action="Detail" asp-controller="Home" asp-route-SensorId="@sensor.ID" class="btn btn-info _trMoreInformation" role="button">@Localizer["MoreInformation"]</a>
</div>
</div>
</div>
}
}
}
</div>
</div>
我认为正确的语法是:
var absolutePath = Context.Server.MapPath(string.Format("~{0}.jpg", sensor.Image));
也许this document可以帮助您找到最合适的方法。
- 如果您使用的是 Razor Pages Web 应用程序,您错过了
@page
并且需要在 cshtml 文件顶部添加@page
指令以使其编译为 class 继承间接来自 IRazorPage 。结果,您将拥有一个 HttpContext 属性 . - 要得到一个
HostingEnvironment
,你可以通过@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment HostingEnvironment
注入它,因此你可以通过ContentRootFileProvider.GetFileInfo(subfilepath).Exists
检查文件是否存在。 - 提醒一下,如果您想在项目的根路径下提供静态文件,请不要忘记
UseStaticFiles(staticFileOpts)
。