C# MVC“;品牌形象;按请求字符串?
在我的MVC应用程序中,我在以下位置有图像。这来自_Layout.cshtml:C# MVC“;品牌形象;按请求字符串?,c#,html,asp.net-mvc,C#,Html,Asp.net Mvc,在我的MVC应用程序中,我在以下位置有图像。这来自_Layout.cshtml: <a href="#"><img src="~/Content/app/images/logo-tlc.png" alt="TLC"></a> 我试图通过解析查询字符串来更改“品牌形象”,比如说pass“apl”表示动物星球。我尝试了以下内容,但不知道您是否可以使用这种concating字符串。它不起作用: <a href="#"><img src="~/
<a href="#"><img src="~/Content/app/images/logo-tlc.png" alt="TLC"></a>
我试图通过解析查询字符串来更改“品牌形象”,比如说pass“apl”表示动物星球。我尝试了以下内容,但不知道您是否可以使用这种concating字符串。它不起作用:
<a href="#"><img src="~/Content/app/images/logo-" + @Request["brand"] + ".png" alt=@Request["brand"]>
我怎样才能做到这一点
它现在正在渲染:
<
<img src="/Content/app/images/logo-" + apl + ".png" alt=apl>
<
您不应该引用查询字符串[]
集合吗?还可以使用HttpUtility.HtmlDecode()取消查询字符串的显示
<img src="~/Content/app/images/logo-@(HttpUtility.HtmlDecode(Request.QueryString["brand"])).png" alt=@(HttpUtility.HtmlDecode(Request.QueryString["brand"]))>
更好的答案是在控制器操作中收集品牌请求参数,并将其存储在会话中,或者构建一个了解品牌并指向正确url的特殊viewmodel。在视图中根据请求参数构建图像url的任何示例都将对XSS打开,或者在未传递参数时为空指针
public ActionResult Index( string brand ) {
if (string.IsNullOrEmpty(brand)) {
brand = "TLC";
}
Session["brand"] = brand;
return View();
}
在你看来:
<img src="@string.format("~/Content/app/images/logo-{0}.png", Session["brand"])" alt="@Session["brand"]">`
`
这似乎对我不起作用,如果我使用一个查询字符串,如您需要转义字符,请使用HttpUtility.HtmlDecode()
这些转义字符是什么?引用?你为什么需要它们?它们似乎不必要QueryString值不需要引号,它们应该key=value&
用一个符号和分隔其他参数。你的例子是key=“value”
,这是多余和不必要的;很抱歉,我仍然无法使用它。问题是,我不是在视图中执行此操作,而是在主视图布局中执行此操作。cshtmlI以前通过在基本控制器内创建一个OnActionExecuting筛选器解决了这种情况,然后我的所有控制器都会扩展该筛选器。通过这种方式,它可以为所有操作运行,并在需要时进行更改。我认为将参数移动到session不会增加任何值,您只需更改Request.QueryStringsession
。我同意添加一个模型属性来保存这个值更好,但是对于这个场景,session和querystring之间并没有真正的功能区别。此外,您还应该避免对这样的琐碎项目使用会话
。如果参数不存在,则在参数周围添加null检查可以使视图不会崩溃。另外,让视图访问请求对象对我来说很讨厌,而且有点像是违反了MVC的理念。这感觉像是控制器的事情。它可能感觉恶心,但我的评论使用会话等。。这不是一个好的标准。您可以轻松创建一些静态帮助器类来处理空检查、默认值..我已经更新了我的答案。。。您不需要在querystring中用引号括起您的值。是的,我看到了问题所在,我已更新了我的答案…对于所有这些答案,请确保您仅在具有请求筛选的服务器中直接访问页面标记内的querystring。如果没有请求过滤,像下面所示的技术将为XSS攻击打开您的站点。