如何从MVC Razor标记中获取查询字符串参数?

Tru*_*an1 65 c# asp.net asp.net-mvc razor asp.net-mvc-4

我想检查Razor标记中的URL参数.例如,我该怎么做这样的事情:

<div id="wrap" class="@{if (URL "IFRAME" PARAMETER EQUALS 1) iframe-page}">
Run Code Online (Sandbox Code Playgroud)

Mar*_*usz 100

类似的线程

<div id="wrap" class=' @(ViewContext.RouteData.Values["iframe"] == 1 ? /*do sth*/ : /*do sth else*/')> </div>
Run Code Online (Sandbox Code Playgroud)

编辑01-10-2014: 由于这个问题非常受欢迎,因此这个答案得到了改进.

上面的示例只会从中获取值RouteData,因此只能从某些已注册路由捕获的查询字符串中获取.要获得查询字符串值,您必须获得当前值HttpRequest.最快的方法是通过调用(如TruMan所指出的)`Request.Querystring',所以答案应该是:

<div id="wrap" class=' @(Request.QueryString["iframe"] == 1 ? /*do sth*/ : /*do sth else*/')> </div>
Run Code Online (Sandbox Code Playgroud)

您还可以检查RouteValues和QueryString MVC吗?

  • 谢谢你的提示.这工作:<div id ="wrap"class ="@(Request.QueryString ["iframe"] =="1"?"iframe":string.Empty)"> (7认同)
  • 您可能需要添加以 [.NET Core 2.1](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.1) 开头的内容,您需要更改` Context` 到 `HttpContext` (4认同)

Flo*_*aal 22

如果你使用.net core 2.0,那将是:

Context.Request.Query["id"]
Run Code Online (Sandbox Code Playgroud)

样品用法:

<a href="@Url.Action("Query",new {parm1=Context.Request.Query["queryparm1"]})">GO</a>
Run Code Online (Sandbox Code Playgroud)

  • 这给出了"当前上下文中不存在名称Context".只是使用Request.Query ["queryparm1"]工作. (2认同)

Alp*_*glu 11

适用于 ASP.NET Core 5.0

您可以通过注入IHttpContextAccessorRazor 页面来获取查询参数。并获取带有对象的任何参数的值Request.Query

示例 URL => https://localhost:44326/?MyParam=MyValue

索引.cshtml:

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor

<span>@HttpContextAccessor.HttpContext.Request.Query["MyParam"][0]</span>
Run Code Online (Sandbox Code Playgroud)

请注意,可能有多个具有相同名称的查询参数,因此这些值存储在一个集合中。


Rol*_*ana 9

没有一个答案对我有用,我得到“'HttpRequestBase'不包含'查询'的定义”,但这确实有效:

HttpContext.Current.Request.QueryString["index"]
Run Code Online (Sandbox Code Playgroud)


Yav*_*nyP 5

我认为更优雅的解决方案是使用控制器和ViewData字典:

//Controller:
public ActionResult Action(int IFRAME)
    {
        ViewData["IsIframe"] = IFRAME == 1;
        return View();
    }

//view
@{
    string classToUse = (bool)ViewData["IsIframe"] ? "iframe-page" : "";
   <div id="wrap" class='@classToUse'></div>
 }
Run Code Online (Sandbox Code Playgroud)

  • 该视图在许多控制器之间共享.我认为这样做会很麻烦,而不是直接将逻辑放在Razor标记中.此外,我预计我可能也必须在部分视图中执行此操作. (3认同)
  • 我不这么认为 (2认同)

x56*_*657 5

有人建议将此作为答案发布,因为其他一些答案会给出错误,例如"当前上下文中不存在名称上下文".

只需使用以下作品:

Request.Query["queryparm1"]
Run Code Online (Sandbox Code Playgroud)

样品用法:

<a href="@Url.Action("Query",new {parm1=Request.Query["queryparm1"]})">GO</a>
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,但这确实有效:Request.QueryString (2认同)