2012-04-11 133 views
1

我不太清楚如何去做这件事。基本上我有一个域名,我们将其称为domain.com。该域本身就是公司网站,然后有特许经营商网站通过正斜杠参数访问。因此,例如domain.com/atl可能是加盟商网站。这些加盟商网站与公司网站相同,因此您基本上只是为每个加盟商重新创建整个网站。MVC中的路由3

对我来说,这是棘手的部分。特许经营商网站上的某些页面需要进行定制。所以我的想法是,这应该由一个数据库控制,我只需要将“atl”作为一个参数命中数据库并返回基于点击链接的页面内容,这样我就拥有了基本上1个视图文件,可以提供无限数量的加盟商。

我不明白的是你怎么传递这个参数。链接例如。比方说,我去domain.com/atl,我点击一个名为“东西”的链接。你会怎么做,以这样的方式发送到“东西”视图,并将其显示为domain.com/atl/stuff而不是domain.com/stuff?

有没有一个词来形容这个系统,这将使我的研究更容易?还是有人有一个链接,将我指向正确的方向?谢谢。

回答

1

MikeSW is close about the route,但它听起来像你不希望加盟商页面与公司页面共享任何控制器。我有一对夫妇其他的想法太:

routes.MapRoute(null, // do not name your routes, they are "magic strings" 
    "{tenant}/{controller}/{action}", 
    new 
    { 
     // strongly type controller, action, and area names using T4MVC 
     controller = MVC.Home.Name,    
     action = MVC.Home.ActionNames.Index, 
     // it sounds here like you want this controller for franchisees only, 
     // so corporate pages will use other controllers. if this is the case, 
     // tenant="default" // require the parameter by not supplying a default 
    }); 

的理由不来命名你的路由是因为不点名地迫使你在某些HTML辅助和控制方法,使用某些过载。 RedirectToRoute@Html.RouteLink@Url.RouteUrl等方法中的很多重载将路由名称作为第一个参数。通过省略路由名称,这迫使我们使用仅依赖路由参数和HTTP方法的重载来解析控制器和操作。 (T4MVC在这里也很有帮助,因为它允许我们为这些方法的参数强制键入区域,控制器和操作名称。)

MVC将自动在呈现视图的URL中使用“环境”路由参数。所以,如果你在URL domain.com/atl和要链接到domain.com/atl/stuff,可以输出这样一个超级链接:

@Html.RouteLink("Stuff", new 
{ 
    // this will render a link with the URL domain.com/atl/stuff 
    controller = MVC.Stuff.Name, 
    action = MVC.Stuff.ActionNames.Index, 
    // you do not need to include franchisee 
}) 

(如果你想渲染只是URL为一个普通的HTML <a>标签的href参数使用@Url.RouteUrl代替)

在另一方面,如果你想从一个加盟商网站到另一条链路,你就必须指定专营参数:

@Html.RouteLink("Another franchisee in this state", new 
{ 
    // this will render a link with the URL domain.com/macon 
    controller = MVC.Home.Name, 
    action = MVC.Home.ActionNames.Index, 
    franchisee = "macon" 
}) 
+0

T4MVC似乎没有为我工作这么热。当试图引用控制器中的视图时,它给了我一个无效的参数错误。 – Nozoku 2012-04-13 16:47:58

+0

奇怪的是,视图在T4MVC中没有参数。它们只是MVC对象的静态属性。在这里张贴另一个问题,有人会帮助你。 – danludwig 2012-04-13 17:59:35

+0

我最终修复了它。我不正确地引用它。我试图在另一个控制器中引用一个视图,我不知道如何执行它的语法,所以我尝试了直到我认为我找到了一些可行的方法,并且这是一种错误的方法。 – Nozoku 2012-04-17 02:47:43

0

在路由中,视图并不重要,只有控制器在选择要返回的视图时很重要。毕竟,我认为这是关于多租户的,至少在这种情况下,这个租户非常简单。有一个路由定义,其中包括租户名称或ID

routes.MapRoute("default","{tenant}/{controller}/{action}",new{ tenant="default", controller="home", action="index"}) 

通过这种途径,如果未指定房客asumed是“默认”(也许是企业网站本身)。

关于一些需要定制的页面,数据库是存储的东西,而不是控制逻辑。我认为,事情比你想象的要简单,你只需要在db(某个视图名称或CSS,js)中存储一些定制细节,然后将这些定制细节提供给视图。基本上,控制器从数据库获取所需的最小信息,然后选择相关视图,创建视图模型并返回该视图。

+0

那么什么我要找的是有能力去根据/特许经营商的价值提供内容。所以基本上我需要做2件事。 1:获取用户输入的/加盟商ID并将其用作数据库中的参数以显示所选页面的内容。 2:保持/加盟商ID显示在浏览器的网址栏中,使其显示在不同的部分,即使该部分不存在。 – Nozoku 2012-04-11 14:39:33

0

通过使用像结构图这样的IOC容器实际创建多租户Web应用程序,您可以采用不同的方法。 Zack Owens has a starter sample on how do this

创建一个多租户的web应用程序显然比可以放在一个帖子更多,但你可以msg我,如果你想要更多的信息。

我认为如果你试图用路由处理所有这些都会造成一团糟。

+0

有趣的博客系列。虽然我不喜欢使用Spark视图引擎的部分。这似乎对于复杂的多租户计划来说是个好主意,但对于更简单/更便宜的应用程序来说,这可能是过度的。 – danludwig 2012-04-11 07:26:31

+0

如果我正确理解多租户,这涉及到多个域是否正确?我不确定这是如何工作的情况下,你只有一个域名? – Nozoku 2012-04-11 14:29:57

+0

他的示例是为他的用例而创建的,决不能将其放到项目中,但它可以为您提供一些关于如何读取请求的想法,根据请求提取IOC容器,并根据该请求提供数据请求。我也不喜欢火花,但这是关于开源的好处。只要改变它。所以为了无耻的自我推销,如果你想得到一些详细的帮助,我会做合同工。 – 2012-04-11 15:49:28