在 Url.Action route 值中保留 ${name},以便与 jquery.tmpl 一起使用
本文关键字:jquery tmpl 一起 name route Action Url 保留 | 更新日期: 2023-09-27 18:27:29
我在这里有点偏离人迹罕至的地方,但这似乎并不太不合理。
在视图中,使用此代码:
<div>Hello ${Name}</div>
运行通过 { Id: 1, Name = ">Bob" } 提供的 jquery.tmpl,将在客户端上呈现以下内容:
<div>Hello Bob</div>
这很棒,但让我们介绍一个 Url:
在视图中,使用此代码:
<div>Hello <a href="<%: Url.Action("Profile", new { id= "${Id}" }) %>">${Name}</a></div>
渲染到:
<div>Hello <a href="/User/Profile?id=%24%7BId%7D">${Name}</a></div>
在运行jquery.tmpl之后,编码的Id标签不会被拾取:
<div>Hello <a href="/User/Profile?id=%24%7BId%7D">Bob</a></div>
我理解为什么会发生这种情况,但我正在努力解决一种防止路由值被编码的方法。在反编译的代码中挖掘了一段时间后,我失去了踪迹,我无法理解编码的实际机制。如果是我,我会将路由值转换为HttpNameCollection
并对其进行ToString
,例如使用 HttpUtility.Parse()
.
MVC 在这样的事情上非常灵活,所以我很难相信我不能用MvcHtmlString
或其他东西更改编码器或包装路由值值。
如何获取 Url.Action,无论是来自 UrlHelper 扩展还是替换和扩展的编码器,都使用 jquery.tmpl 格式保留路由值:${value}
不是最漂亮的方法,但你可以把它包装在一个Server.UrlDecode
函数中。所以你的代码看起来像
<a href="<%: Server.UrlDecode(Url.Action("Profile", new { id= "${Id}" })) %>">${Name}</a>
这将输出/User/Profile?id=${id}
另一种方法是创建自己的 Html 帮助程序,它将返回 RAW 输入而不是对其进行编码。我不得不对ActionLink
做类似的事情.看看我关于它的博客文章。带有 HTML 内容的 MVC ActionLink。