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


81

我想检查我的Razor标记中的URL参数。例如,如何执行以下操作:

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

Answers:


118

类似线程

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

编辑2014年1月10日: 由于此问题如此受欢迎,因此此答案已得到改善。

上面的示例仅从中获取值RouteData,因此仅从某些已注册路由捕获的查询字符串中获取值。要获取querystring值,您必须获取current HttpRequest。最快的方法是调用(如TruMan所指出的)“ Request.Querystring”,因此答案应该是:

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

您还可以检查RouteValues与QueryString MVC?

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

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

请注意,我StringValues("1")在声明中使用的是因为Query返回StringValuesstruct而不是pure string。这是我发现的这个场景的清洁方法。


7
感谢您的提示。这起作用了:<div id =“ wrap” class =“ @(Request.QueryString [” iframe“] ==” 1“?” iframe“:string.Empty)”>
TruMan1 2012年

1
我会在您的答案中添加@ TruMan1的评论。在我的情况下,值不在路线数据中(使用nop-commerce),但可以通过请求进行访问。
伊恩

需要说明的是-例如,如果视图是由于重定向而显示的,则可以使用Request.QueryString
Chris Halcrow

您可能需要添加从.NET Core 2.1开始的内容,您需要更改ContextHttpContext
IvanGarcíaTopete

33

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

Context.Request.Query["id"]

用法示例:

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

3
这给出了“名称上下文在当前上下文中不存在”。不过,仅使用Request.Query [“ queryparm1”]即可。
x5657 '18

1
@ x5657您应该发表评论作为答案,因为这是真正对我有用的唯一解决方案!
Jpsy

11

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

只需使用以下作品:

Request.Query["queryparm1"]

用法示例:

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

2
那对我来说不起作用,但确实如此:Request.QueryString
TroySteven


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 2012年

更为优雅的解决方案是将其作为ViewModel的一部分返回 return View(new SomeViewModel{ IsIFrame = IFrame });
Jose Capistrano

1

对于Asp.net Core 2

ViewContext.ModelState["id"].AttemptedValue

我只是添加一点,尽管它说AttempValue-如果查询字符串中不存在该参数,您将得到一个异常,因此您应该首先检查:@if (ViewContext.ModelState["id"] != null)...
adinas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.