【发布时间】: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
我想检查我的 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
<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。这为我找到的这个场景提供了清理方法。
【讨论】:
Context 更改为HttpContext
如果您使用的是 .net core 2.0,则为:
Context.Request.Query["id"]
示例用法:
<a href="@Url.Action("Query",new {parm1=Context.Request.Query["queryparm1"]})">GO</a>
【讨论】:
建议将此作为答案发布,因为其他一些答案会给出错误,例如“当前上下文中不存在名称上下文”。
只需使用以下作品:
Request.Query["queryparm1"]
示例用法:
<a href="@Url.Action("Query",new {parm1=Request.Query["queryparm1"]})">GO</a>
【讨论】:
没有一个答案对我有用,我得到“'HttpRequestBase' 不包含 'Query' 的定义”,但这确实有效:
HttpContext.Current.Request.QueryString["index"]
【讨论】:
适用于 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>
请注意,可能有多个同名的查询参数,因此这些值存储在一个集合中。
【讨论】:
我认为更优雅的解决方案是使用控制器和 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>
}
【讨论】:
return View(new SomeViewModel{ IsIFrame = IFrame });
对于 Asp.net Core 2
ViewContext.ModelState["id"].AttemptedValue
【讨论】:
AttempValue - 如果查询字符串中不存在该参数,您将收到异常,因此您应该首先检查:@if (ViewContext.ModelState["id"] != null)...