2

我觉得我在这里重新发明了轮子,但我需要找到一种方法从一个包罗万象的 URL 中获取 URL,并将其重定向到另一条路线。

这样做的原因是因为我需要做一些事情,比如为某些 url 添加会话 cookie,然后将它们传递给他们的相关操作。

实现这一点的最佳方法是什么?

提前感谢您的帮助!

4

4 回答 4

2

您可以尝试在运行时更改母版页。虽然这不是最漂亮的解决方案。

主题支持

于 2008-11-20T08:05:38.873 回答
0

如果我理解问题...

查看您之前的问题(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 路由进行单元测试的方法时提出了这一点:

http://weblogs.asp.net/stephenwalther/archive/2008/07/02/asp-net-mvc-tip-13-unit-test-your-custom-routes.aspx

我不确定它是否完全适合(即可能不必模拟东西),但看起来所有数据都是从 GetRouteData 返回以传递给 RedirectToAction 方法。

于 2008-11-15T02:51:31.613 回答
0

哦,所以你不想要重定向?您希望 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 中!)这样您就不必重复代码如果您想对合作伙伴进行一些基本的检查/操作,则在每个操作中。

这是一篇关于给猫剥皮的很多方法的不错的文章:

http://weblogs.asp.net/stephenwalther/archive/2008/08/12/asp-net-mvc-tip-31-passing-data-to-master-pages-and-user-controls.aspx

于 2008-11-16T22:40:29.873 回答
0

不,它实际上是重定向,但重定向对用户不可见(与在 Web 窗体中完成 Server.Transfer() 的方式大致相同。

您指向的链接仅使用一个母版页,而我有许多母版页(接近 200 个)。

我曾考虑为这些合作伙伴提供单独的路由处理程序,但母版页的选择进入了等式。

我想我将不得不创建一个 ViewExtension 来克服这些问题......

于 2008-11-17T09:12:37.960 回答