【发布时间】:2010-09-22 09:09:15
【问题描述】:
我觉得我在这里重新发明了轮子,但我需要找到一种方法从一个包罗万象的 URL 中获取一个 URL,并将其重定向到另一个路由。
这样做的原因是因为我需要做一些事情,比如为某些 url 添加会话 cookie,然后将它们传递给相关操作。
实现这一点的最佳方式是什么?
提前感谢您的帮助!
【问题讨论】:
标签: asp.net asp.net-mvc routing
我觉得我在这里重新发明了轮子,但我需要找到一种方法从一个包罗万象的 URL 中获取一个 URL,并将其重定向到另一个路由。
这样做的原因是因为我需要做一些事情,比如为某些 url 添加会话 cookie,然后将它们传递给相关操作。
实现这一点的最佳方式是什么?
提前感谢您的帮助!
【问题讨论】:
标签: asp.net asp.net-mvc routing
您可以尝试在运行时更改母版页。不过,这不是最漂亮的解决方案。
【讨论】:
如果我理解问题...
查看您想要从以下位置获取通配符的上一个问题 (redirect-to-controller-but-with-a-different-master-using-a-catchall-wildcard):
routes.MapRoute(
"Partner",
"partners/{partner}/{*wildcard}",
new { controller = "Partners", action = "PartnerRedirect" }
);
并在 Partners/PartnerRedirect 操作中,将其发送到通配符中指定的正确控制器/操作?
我不知道最好的方法,但是查看单元测试 url 路由的方法提出了这个:
我不确定它是否完全适合(即可能不必模拟东西),但看起来所有数据都是从 GetRouteData 返回以传递给 RedirectToAction 方法。
【讨论】:
哦,所以你不想重定向?您希望 URL 保留:
mysite.com/partners/pepsi/products/cola.htm
但服务:
mysite.com/products/cola.htm
我家里没有 MVC,但你不能用不同的方式定义你的路线吗?
代替:
routes.MapRoute(
"Partner",
"partners/{partner}/{*wildcard}",
new { controller = "Partners", action = "PartnerRedirect" }
);
做:
routes.MapRoute(
"Partner",
"partners/{partner}/{controller}/{action}/{other stuff you need}",
new { /* whatever defaults you want */ }
);
该操作现在可以使用合作伙伴变量来执行任何操作,并且您可以向合作伙伴添加路由约束,以便只有有效的匹配。
(我认为)然后您可以在您的操作/控制器上使用操作过滤器,以根据合作伙伴参数执行适当的操作(我认为它应该在过滤器的 httpcontext 中!)这样您就没有如果您想对合作伙伴进行一些基本检查/操作,请在每个操作中重复代码。
这里有一篇关于给猫剥皮的很多方法的不错的文章:
【讨论】:
不,它实际上是重定向,但重定向对用户不可见(与在 Web 窗体中完成 Server.Transfer() 的方式非常相似。
您指向的链接仅使用一个母版页,而我有许多母版页(接近 200 个)。
我曾考虑为这些合作伙伴提供单独的路由处理程序,但母版页选择进入了等式。
我想我将不得不创建一个 ViewExtension 来克服这些问题...
【讨论】: