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

107

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

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

162

类似的主题


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

编辑于2014年1月10日: 由于此问题非常受欢迎,因此已对此答案进行了改进。

上面的示例仅会获取来自RouteData的值,因此仅限于被某些注册路线捕获的查询字符串。要获取查询字符串的值,必须访问当前的HttpRequest。最快的方法是调用(如TruMan指出的)`Request.QueryString',因此答案应该是:

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

您还可以查看RouteValues vs QueryString MVC?

编辑 2019年03月05日: 上述解决方案适用于 .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。这是我发现的适用于此情况的清晰方式。

8
谢谢提示。这个起作用了:<div id="wrap" class="@(Request.QueryString["iframe"] == "1" ? "iframe" : string.Empty)"> - TruMan1
1
我会在你的答案中加入@TruMan1的评论。在我的情况下,这些值不在路由数据中(使用nop-commerce),但可以通过请求访问。 - Ian
澄清一下 - 如果视图是由重定向引起的,例如,您将使用Request.QueryString。 - Chris Halcrow
5
.NET Core 2.1开始,您需要将Context更改为HttpContext - Ivan García Topete
1
可以了,谢谢。@Context.Request.Query["iframe"] - Sedat Kumcu
1
感谢您的努力,多次更新是受欢迎的。 - Bonez024

43

如果您正在使用 .net core 2.0,则应该是:

Context.Request.Query["id"]

示例用法:

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

5
这会出现“当前上下文中不存在名称为Context的内容”错误。但只使用Request.Query["queryparm1"]是有效的。 - x5657
1
@x5657,你应该把你的评论发布为答案,因为它是唯一真正对我有用的解决方案! - Jpsy

15

有人建议将此作为答案发布,因为其他一些答案出现了诸如“当前上下文中不存在Context名称”的错误。

只需使用以下内容即可:

Request.Query["queryparm1"]

使用示例:

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

3
这个方法对我无效,但这个可以:Request.QueryString。 - TroySteven

11

适用于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>

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

1
不要忘记添加NuGet包Microsoft.AspNetCore.Http。 - user160357
这对我来说有效,即使在 .NET Core 7.0 Core Web API 中没有 Microsoft.AspNetCore.Http。 - undefined

10

对我来说,这些答案都没有起作用,我一直看到 "'HttpRequestBase' does not contain a definition for 'Query'",但是这个方法可行:

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

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>
 }

3
许多控制器都持有这种观点。我认为这样做会变得混乱,与直接在 Razor 标记中编写逻辑相比。而且,我预计我可能也需要在部分视图中这样做。 - TruMan1
更优雅的解决方案是将其作为ViewModel的一部分返回return View(new SomeViewModel{ IsIFrame = IFrame }); - Jose Capistrano

1
对于Asp.net Core 2
ViewContext.ModelState["id"].AttemptedValue

我想强调的是,虽然它说“AttemptValue”,但如果查询字符串中不存在该参数,您将会收到一个异常,因此您应该首先检查:“@if(ViewContext.ModelState [“id”]!= null)...” - adinas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接