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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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)...

以上是关于如何从 MVC Razor 标记中获取查询字符串参数?的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 (Razor) Json 获取Controller中的反序列化数据

在 MVC/Razor 中,如何获取多个复选框的值并将它们全部传递给控制器​​?

如何通过 MVC Razor 代码获取枚举成员的显示名称属性?

MVC3.0 中Razor 学习

[Asp.Net Core]MVC_Razor布局

[Asp.Net Core]MVC_Razor布局