Asp.net mvc 3 mvc3中的路由

Asp.net mvc 3 mvc3中的路由,asp.net-mvc-3,routing,Asp.net Mvc 3,Routing,我不太清楚该怎么做。基本上我有一个域名,我们就叫它domain.com。域本身就是公司网站,然后是通过正斜杠参数访问的特许经营商网站。因此,例如domain.com/atl可能是特许经营人网站。这些特许经营商网站与企业网站相同,因此您基本上只是为每个特许经营商重新创建整个网站 对我来说,这是棘手的部分。特许经营商网站上的某些页面需要定制。因此,我的想法是,这应该由数据库控制,我只需要将“atl”作为一个参数,点击数据库并根据单击的链接返回页面内容,这样我基本上有一个视图文件,可以为无限数量的特许

我不太清楚该怎么做。基本上我有一个域名,我们就叫它domain.com。域本身就是公司网站,然后是通过正斜杠参数访问的特许经营商网站。因此,例如domain.com/atl可能是特许经营人网站。这些特许经营商网站与企业网站相同,因此您基本上只是为每个特许经营商重新创建整个网站

对我来说,这是棘手的部分。特许经营商网站上的某些页面需要定制。因此,我的想法是,这应该由数据库控制,我只需要将“atl”作为一个参数,点击数据库并根据单击的链接返回页面内容,这样我基本上有一个视图文件,可以为无限数量的特许经营商服务

我不明白的是你怎么传递这个参数。例如,链接。假设我进入domain.com/atl,点击一个名为“stuff”的链接。您将如何将其路由到“stuff”视图,并将其显示为domain.com/atl/stuff而不是domain.com/stuff


有没有一个词来描述这个系统,使我的研究更容易?或者有没有人能把我引向正确的方向?谢谢。

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

routes.MapRoute("default","{tenant}/{controller}/{action}",new{ tenant="default", controller="home", action="index"})
如果未指定租户,则使用此路由将被视为“默认”(可能是公司站点本身)


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

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

routes.MapRoute("default","{tenant}/{controller}/{action}",new{ tenant="default", controller="home", action="index"})
如果未指定租户,则使用此路由将被视为“默认”(可能是公司站点本身)


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

通过使用类似structuremap的IOC容器实际创建多租户web应用程序,您可以采取另一种方法

创建一个多租户的网络应用程序显然超出了发布的范围,但如果您需要更多信息,可以给我发消息


我认为,如果你试图用路由来处理这一切,你会弄得一团糟。

有一种不同的方法,你可以使用像structuremap这样的IOC容器来实际创建一个多租户web应用程序

创建一个多租户的网络应用程序显然超出了发布的范围,但如果您需要更多信息,可以给我发消息

我认为,如果你试图通过路由来处理这一切,你的网站将变得一团糟。

,但听起来你好像不希望特许经营商页面与公司页面共享任何控制器。我还有一些其他想法:

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方法的重载来解析控制器和操作。(在这里也很有用,因为它允许我们为这些方法的参数强力键入区域、控制器和操作名称。)

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
})
(如果要仅呈现普通HTML
标记的href参数的URL,请改用
@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"
})
,但听起来您不希望特许经营人页面与公司页面共享任何控制器。我还有一些其他想法:

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方法的重载来解析控制器和操作。(在这里也很有用,因为它允许我们为这些方法的参数强力键入区域、控制器和操作名称。)

MVC将在呈现视图的URL中自动使用“环境”路由参数。因此,如果您位于URL
domain.com/atl
,并且想要链接到
domain.com/atl/stuff
,您可以输出如下超链接:<