在ASP.NET MVC中,您可以非常轻松地返回重定向ActionResult:
return RedirectToAction("Index");
or
return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });
Run Code Online (Sandbox Code Playgroud)
这实际上会提供HTTP重定向,这通常很好.但是,当使用谷歌分析时,这会导致很大的问题,因为最初的引用会丢失,所以谷歌不知道你来自哪里.这会丢失有用的信息,例如任何搜索引擎术语.
作为旁注,此方法的优点是可以删除任何可能来自广告系列但仍允许我捕获服务器端的参数.将它们留在查询字符串中会导致人们加入书签或推特或博客链接,而这些链接不应该存在.我已经多次看到这样的情况,人们在我们的网站上链接了包含广告系列ID的链接.
无论如何,我正在为网站的所有传入访问写一个"网关"控制器,我可能会重定向到不同的地方或替代版本.
现在我更关心谷歌(比意外的书签),我希望能够发送访问/该页面的人,如果他们去了/home/7,这是主页的第7版.
就像我之前说的如果我这样做,我失去了谷歌分析引用者的能力:
return RedirectToAction(new { controller = "home", version = 7 });
Run Code Online (Sandbox Code Playgroud)
我真正想要的是一个
return ServerTransferAction(new { controller = "home", version = 7 });
Run Code Online (Sandbox Code Playgroud)
这将使我看到没有客户端重定向的视图.我不认为这样的事情存在.
目前我能想到的最好的事情是HomeController.Index(..)在我的GatewayController.IndexAction中复制整个控制器逻辑.这意味着我必须'Views/Home'进入,'Shared'因此它是可访问的.肯定有更好的办法??..
在尝试让我的应用程序正确生成404错误时,我在路由表的末尾实现了catch all route,如下所示:
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
Run Code Online (Sandbox Code Playgroud)
但是,为了使这个工作,我不得不删除默认路由:
{controller}/action/{id}
Run Code Online (Sandbox Code Playgroud)
但是现在已经删除了默认设置,我的大部分操作链接都不再有效,而我找到让它们再次工作的唯一方法是为每个控制器/操作添加单独的路由.
是否有更简单的方法,而不是为每个控制器/操作添加路由?
是否可以创建一个默认路由,如果用户尝试导航到未知路由,仍然允许捕获所有路由?
我需要一个实现,我可以在我的ASP.NET控制器上获得无限的参数.如果我举个例子,那会更好:
我们假设我将有以下网址:
example.com/tag/poo/bar/poobar
example.com/tag/poo/bar/poobar/poo2/poo4
example.com/tag/poo/bar/poobar/poo89
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它将获得无限数量的标记,example.com/tag/并且斜杠将成为此处的分隔符.
在控制器上我想这样做:
foreach(string item in paramaters) {
//this is one of the url paramaters
string poo = item;
}
Run Code Online (Sandbox Code Playgroud)
有没有任何已知的方法来实现这一目标?如何从控制器获取值?用Dictionary<string, string>或List<string>?
注意 :
IMO没有很好地解释这个问题,但我尽力适应它.in.随意调整它