如何从 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 中,如何获取多个复选框的值并将它们全部传递给控制器?