Asp.net mvc ASP.NET MVC 5为每个url添加一个额外的查询字符串参数
我需要在ASP.NET MVC页面(包括索引页面)上的所有呈现URL中添加一个额外的(但每个用户都是静态的)查询字符串参数。因此,当用户单击任何URL时,他们应该会在浏览器地址栏中看到如下内容:Asp.net mvc ASP.NET MVC 5为每个url添加一个额外的查询字符串参数,asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,我需要在ASP.NET MVC页面(包括索引页面)上的所有呈现URL中添加一个额外的(但每个用户都是静态的)查询字符串参数。因此,当用户单击任何URL时,他们应该会在浏览器地址栏中看到如下内容: domain.com?extra=code domain.com/controller/action?extra=code domain.com/controller/action?otherparams=something&extra=code 等等 因此,页面上的每个url都应该包含这个额
domain.com?extra=code
domain.com/controller/action?extra=code
domain.com/controller/action?otherparams=something&extra=code
等等
因此,页面上的每个url都应该包含这个额外的查询字符串参数
我怎样才能做到这一点呢?没有内置的方法来实现这一点。我能想到的最可重用的方法是创建
UrlHelper
扩展,然后使用该扩展呈现整个站点的所有URL:
public static class UrlHelperExtensions
{
public static string MyAction(this UrlHelper urlHelper, string actionName)
{
return urlHelper.Action(actionName) + "?extra=code";
}
}
基本上,将方法版本中的所有参数代理到原始版本,同时将额外的内容添加到生成的URL末尾。但是,为了完整性,您需要为每个方法签名(请参见:)以及Url.RouteUrl
的所有签名提供等效的扩展,以防使用该扩展。此外,如果您想利用HTML帮助程序,如HTML.ActionLink
,您还需要对HtmlHelper
执行相同的操作,为每个签名以及HTML.RouteLink
创建等效的扩展。根据您想进入的兔子洞的深度,您可能还需要对Html.BeginForm
等内容执行相同的操作。即使如此,只要每个开发人员在任何时候都接触到应用程序,并且总是使用自定义扩展,而不是每个链接的内置帮助程序,该中心也只能支持
显然,这不是小事。我会猜测任何需要这一点的商业案例。能用另一种更简单的方法解决吗?例如,如果您只需要在请求之间持久化此代码,那么您是否应该将其添加到会话中?然后,URL的格式就不再重要了。当您指定路由时,请使用从
Route
派生的、覆盖GetVirtualPath
的类来添加自定义查询参数。比如,,
请参阅,它使用该技术添加了一个
子域
查询参数。我不想在querystring到达控制器之前更改它,我想修改站点上呈现的所有URL。最后,我在客户端解决了这个问题。我将额外的代码发送到隐藏输入中,然后javascript更改window.history.replaceState以将代码添加到url中。但是你的解决方案是一个很好的解决方案,所以我把它作为解决方案签了名。非常感谢。您不应该依赖于纯JavaScript解决方案。JavaScript可以被禁用,盲人使用的一些屏幕阅读器根本不支持JavaScript。只要您的应用程序在没有向查询字符串添加额外的位的情况下仍能工作,您就可以了。否则,你需要一个更好的解决方案。我同意你的观点,只是这是一个nopcommerce项目,在客户端解决主题中的问题要容易得多,因为将某个问题转变为整个系统:(“更容易”是走向毁灭的道路。正确的方法和简单的方法很少相交。