ASP.NET _ViewStart.cshtml - 获取请求

use*_*192 5 c# razor asp.net-core

我有一个 ASP.NET 应用程序。我的应用程序有一个 _ViewStart.cshtml 文件。该文件如下所示:

@using MyCompany.MyApp;
@{
  Layout = "/Views/Shared/_Layout.cshtml";

  var p = HttpContext.Current.Request.QueryString["parameter"];
  ViewBag.QSParameter = p;
}
Run Code Online (Sandbox Code Playgroud)

当我执行此代码时,出现以下错误:

The name 'HttpContext' does not exist in the current context
Run Code Online (Sandbox Code Playgroud)

我不明白。_ViewStart.cshtml 不是视图的“外壳”吗?我试图弄清楚如何全局读取查询字符串参数并为每个请求在 ViewBag 上设置一个值。我认为这就是这样做的方法。

谢谢

Pet*_*ter 5

您应该有权访问Request_ViewStart 文件。

尝试这个:

@using MyCompany.MyApp;
@{
  Layout = "/Views/Shared/_Layout.cshtml";

  var p = Request.QueryString["parameter"];
  ViewBag.QSParameter = p;
}
Run Code Online (Sandbox Code Playgroud)

编辑:对于 ASP.NET 5

我的机器上没有 ASP.NET 5,但查看了该框架的源代码。看起来有一个Context属性RazorPage返回一个HttpContext. 或者,您可以HttpContext通过 访问ViewContext。见下文:

@{
  Layout = "/Views/Shared/_Layout.cshtml";

  var p = Context.Request.Query["parameter"];
  // or this...
  // var p = ViewContext.HttpContext.Request.Query["parameter"];
  ViewBag.QSParameter = p;
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*tie 4

要从 检索它_ViewStart.cshtml,您可以使用:

ViewBag.QSParameter = Context.Request.Query["parameter"];
Run Code Online (Sandbox Code Playgroud)

注意:在 ASP.NET 5 中Query立即使用(超过QueryString

但是,我可能会选择走不同的路线并利用IResultFilter

public class QSParameterFilter : IResultFilter
{
  public void OnResultExecuting(ResultExecutingContext context)
  {
    var QSParameter = context.HttpContext.Request.Query["parameter"];
    ((Controller)context.Controller).ViewBag.QSParameter = QSParameter;
  }
  public void OnResultExecuted(ResultExecutedContext context) { }
}
Run Code Online (Sandbox Code Playgroud)

然后,在 Startup.cs 中注册它:

services.AddMvc();
services.Configure<MvcOptions>(options => {
  options.Filters.Add(new QSParameterFilter());
});
Run Code Online (Sandbox Code Playgroud)