ASP.NET MVC 5为每个URL添加额外的查询字符串参数

时间:2015-11-30 13:07:22

标签: asp.net-mvc asp.net-mvc-5

我需要在ASP.NET MVC页面上的所有渲染网址中添加一个额外的(但是每用户静态)查询字符串参数,包括索引页面。因此,当用户点击任何网址时,他们应该在浏览器地址栏中看到这样的内容:

domain.com?extra=code
domain.com/controller/action?extra=code
domain.com/controller/action?otherparams=something&extra=code

等...

因此,应该呈现页面上的每个url,其中包含此额外的查询字符串参数。

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

没有内置的方法来实现这一目标。关于我能想到的最可重用的方法是创建UrlHelper扩展程序,然后使用该扩展程序呈现您网站上的所有网址:

public static class UrlHelperExtensions
{
    public static string MyAction(this UrlHelper urlHelper, string actionName)
    {
        return urlHelper.Action(actionName) + "?extra=code";
    }
}

基本上将您的方法版本中的所有参数代理到原始版本,同时将额外的内容添加到生成的URL的末尾。但是,为了完整性,您需要为每个方法签名提供等效扩展(请参阅:https://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.action(v=vs.118).aspx#M:System.Web.Mvc.UrlHelper.Action),以及Url.RouteUrl的所有签名,以防使用。此外,如果您想利用Html.ActionLink等HTML帮助程序,您还需要为HtmlHelper执行相同的操作,为每个签名创建相同的扩展名,以及Html.RouteLink。根据您想要去的兔子洞的深度,您可能还需要对Html.BeginForm之类的事情做同样的事情。即便如此,只要触摸应用程序的所有时间的每个开发人员都使用自定义扩展而不是每个链接的内置帮助程序,中心只能保留。

显而易见,这是非平凡的。我会猜测任何需要这个的商业案例。它可以用另一种方式解决,更简单的方法吗?例如,如果您只需要在请求之间保留此代码,也许您应该将其添加到会话中?然后,URL的格式不再重要。

答案 1 :(得分:1)

指定路由时,请使用从set.seed(1) high_grp <- 1:10000; high_obs = 1000000; low_grp <- 1:100; low_obs = 50000; low_grp_high_obs <- data.table(Group = sample(low_grp, high_obs, replace = T), Diff = sample(-60000:60000, high_obs, replace = T)) high_grp_high_obs <- data.table(Group = sample(high_grp, high_obs, replace = T), Diff = sample(-60000:60000, high_obs, replace = T)) low_grp_low_obs <- data.table(Group = sample(low_grp, low_obs, replace = T), Diff = sample(-60000:60000, low_obs, replace = T)) high_grp_low_obs <- data.table(Group = sample(high_grp, low_obs, replace = T), Diff = sample(-60000:60000, low_obs, replace = T)) comparison_sets <- list("Low Group; High Obs" = low_grp_high_obs, "High Group; High Obs" = high_grp_high_obs, "Low Group; Low Obs" = low_grp_low_obs, "High Group; Low Obs" = high_grp_low_obs) comparison <- lapply(comparison_sets, function(dt) {microbenchmark::microbenchmark(orig = dt[,total := ifelse(seq_len(.N) == .N, sum(Diff, na.rm = T), NA), by = Group], merge = dt[dt[, sum(Diff, na.rm=TRUE), by=Group], on=.(Group), mult="last", total := i.V1 ])} ) comparison #$`Low Group; High Obs` #Unit: milliseconds # expr min lq mean median uq max neval # orig 53.16160 58.00227 69.93443 60.08673 62.57489 191.1628 100 # merge 12.93931 15.15634 17.90187 15.56495 18.33738 147.9433 100 # #$`High Group; High Obs` #Unit: milliseconds # expr min lq mean median uq max neval # orig 143.60222 151.8497 161.65825 154.85638 158.2183 281.2311 100 # merge 23.18698 23.7380 29.20126 24.86465 29.9832 153.7919 100 # #$`Low Group; Low Obs` #Unit: milliseconds # expr min lq mean median uq max neval # orig 3.047569 3.190157 3.957012 3.378145 3.692857 8.087345 100 # merge 1.685882 1.808594 1.928094 1.846520 1.953369 5.998864 100 # #$`High Group; Low Obs` #Unit: milliseconds # expr min lq mean median uq max neval # orig 65.903991 68.727469 69.861163 69.857406 70.950330 76.351860 100 # merge 3.418077 3.595673 3.831805 3.855684 3.952869 5.069314 100 派生的自己的类来覆盖Route以添加自定义查询参数。举个例子,  请参阅this answer,它使用该技术添加GetVirtualPath查询参数。