【问题标题】:How to get query string parameter from MVC Razor markup?如何从 MVC Razor 标记中获取查询字符串参数?
【发布时间】:2012-06-30 04:12:14
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc razor asp.net-mvc-4


    【解决方案1】:

    Similar thread

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

    编辑 01-10-2014: 由于这个问题如此受欢迎,因此该答案已得到改进。

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

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

    您也可以查看RouteValues vs QueryString MVC?

    编辑 03-05-2019: 上述解决方案适用于 .NET Framework。
    正如其他人指出的那样,如果您想在 .NET Core 中获取查询字符串值,则必须使用来自 Context.Request 路径的 Query 对象。所以它会是:

    <div id="wrap" class=' @(Context.Request.Query["iframe"] == new StringValues("1") ? /*do sth*/ : /*do sth else*/')> </div>
    

    请注意我在语句中使用了StringValues("1"),因为Query 返回StringValues 结构而不是纯string。这为我找到的这个场景提供了清理方法。

    【讨论】:

    • 感谢您的提示。这有效:
    • 我会将@TruMan1 的评论添加到您的答案中。在我的情况下,这些值不在路由数据中(使用 nop-commerce),但可以通过请求访问。
    • 您可能想添加以.NET Core 2.1 开头的内容,您需要将Context 更改为HttpContext
    • 这工作..谢谢。 @Context.Request.Query["iframe"]
    • 感谢您多次返回更新。感谢您的努力。
    【解决方案2】:

    如果您使用的是 .net core 2.0,则为:

    Context.Request.Query["id"]
    

    示例用法:

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

    【讨论】:

    • 这给出了“当前上下文中不存在名称上下文”。只需使用 Request.Query["queryparm1"] 即可。
    • @x5657 你应该发表你的评论作为答案,因为它是唯一对我有用的解决方案!
    【解决方案3】:

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

    只需使用以下作品:

    Request.Query["queryparm1"]
    

    示例用法:

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

    【讨论】:

    • 这对我不起作用,但确实如此:Request.QueryString
    【解决方案4】:

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

    HttpContext.Current.Request.QueryString["index"]
    

    【讨论】:

      【解决方案5】:

      适用于 ASP.NET Core 5.0

      您可以通过将IHttpContextAccessor 注入Razor 页面来获取查询参数。并通过Request.Query对象获取任意参数的值。

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

      Index.cshtml:

      @inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
      
      <span>@HttpContextAccessor.HttpContext.Request.Query["MyParam"][0]</span>
      

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

      【讨论】:

      • 别忘了添加 nuget Microsoft.AspNetCore.Http
      【解决方案6】:

      我认为更优雅的解决方案是使用控制器和 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>
       }
      

      【讨论】:

      • 这个视图被许多控制器共享。我认为这样做会变得混乱,而不是将逻辑直接放在 Razor 标记中。此外,我预计我可能也必须在部分视图中执行此操作。
      • 更优雅的解决方案是将其作为 ViewModel 的一部分返回 return View(new SomeViewModel{ IsIFrame = IFrame });
      【解决方案7】:

      对于 Asp.net Core 2

      ViewContext.ModelState["id"].AttemptedValue
      

      【讨论】:

      • 我只是补充一点,虽然它说AttempValue - 如果查询字符串中不存在该参数,您将收到异常,因此您应该首先检查:@if (ViewContext.ModelState["id"] != null)...
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签