2009-05-06 46 views
1

我有 - 我认为 - 一个复杂的URL来处理ASP MVC 1.0: 我在大多数控制器中的所有操作都需要两个参数:Account和Project。这是每个Action的要求之上。这意味着一个典型的URL是这样的:在ASP MVC中处理复杂的URL

http://abcd.com/myaccount/projects/project_id/sites/edit/12 

在这个例子中: 我的帐户是帐户名称。 项目可以是控制器,其他选项是位置,雇员PROJECT_ID是一个项目的我的帐户网站内的ID可能是一个控制器,其他选项都像人员支付编辑是一个动作和是编辑的网站的编号。 (希望这已经足够清晰)

现在一个选项是创建一个路径,并通过向所有操作添加两个额外参数将project_id和帐户传递给控制器​​的所有操作。这并不是真正需要的,我也不确定两个控制器(项目和站点)是否会在这里工作。

我的理想情况是使用某种上下文,它随控制器动作的调用而传递,并在那里存储project_id和myaccount。其余的参数,然后可以以正常的方式处理,如:

// sitescontroller 
public ActionResult Edit(string id) 
{ 
string account = somecontext["account"]; 
string project_id = somecontext["project"]; 
// do stuff 
} 

任何有关如何发生这种情况的想法?此外,这将如何与ActionLink一起工作(即基于此上下文生成正确的链接)?

谢谢!

回答

1

您首先需要为您的路线添加标记,如{company}/projects/{project}{controller}/{action}/{id}。然后,如果您编写了自己的IControllerFactory,那么通过构造函数将RouteData中的值推送到控制器中会非常容易,或者您希望这样做。可能最简单的入门方法是继承DefaultControllerFactory并重写CreateController方法。

-1

这对我来说不太合理。为什么会有类似于以下的路线:

{controller}/{id}/{controller}/{id} 

+0

这是查看它的一种方法。这与Basecamp(37Signals)的工作方式完全相同。如果你在Basecamp中创建一个账户,你会得到这样一个url: http://accountName.basecamphq.com/projects/123/notes/345 ZenDesk也完全一样。 (我认为是GetSatisfaction)。我的要求非常相似。 – Khash 2009-05-06 10:38:59