【问题标题】:Handling complex URLs in ASP MVC在 ASP MVC 中处理复杂的 URL
【发布时间】:2009-05-06 09:24:05
【问题描述】:

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

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

在这个例子中: myaccount 是帐户名称。 projects 可以是控制器,其他选项例如 locationsemployeesproject_idmyaccount 中项目的 ID,sites 可以是控制器,其他选项如 staff付款edit 是一个操作,12 是编辑的站点的 id。 (希望这足够清楚)

现在一个选项是创建一个路由并将 project_id 和 account 传递给控制器​​的所有操作,方法是向所有操作添加两个额外的参数。这并不是真正需要的,而且我不确定这两个控制器(项目和站点)是否可以在这里工作。

我的理想情况是使用某种上下文来调用控制器操作并将 project_id 和 myaccount 存储在其中。然后可以以正常方式处理其余参数,例如:

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      ?

      【讨论】:

      • 这是看待它的一种方式。这与 Basecamp (37Signals) 的工作方式完全相同。如果你在 Basecamp 中创建一个帐户,你会得到一个这样的 url:accountName.basecamphq.com/projects/123/notes/345ZenDesk 也完全一样。 (我认为GetSatisfaction也是如此)。我的要求非常相似。
      • 但可以肯定的是,accountname 不是控制器,而是控制器不需要的参数,而是应用程序本身,以确保您的页面转到正确的公司。你可以按照约翰唐尼的建议做一些事情。我们在我所在的地方做了类似的事情,用父控制器覆盖控制器,并捕获有效的 accountname 参数,并根据他们是谁以及他们想去哪里以不同的方式显示/验证。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多