Asp.net mvc 确定在多租户MVC网站中路由到哪个门户
我正在开发一个简单的MVC2多租户应用程序。我的问题是如何确定用户在url中请求了哪个租户门户? 我需要做的是:Asp.net mvc 确定在多租户MVC网站中路由到哪个门户,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,我正在开发一个简单的MVC2多租户应用程序。我的问题是如何确定用户在url中请求了哪个租户门户? 我需要做的是: 请求应转到标准主控制器的索引页 对的请求应转到ClientPortalHome控制器的索引页 对的请求将转到特定于客户端的登录页 下面的两种方法可以实现这一点,而且似乎效果不错 routes.MapRoute( "Client Portal Default", // Route name "{clientportal}/{controller}/{action}/
- 请求应转到标准主控制器的索引页
- 对的请求应转到ClientPortalHome控制器的索引页
- 对的请求将转到特定于客户端的登录页
routes.MapRoute(
"Client Portal Default", // Route name
"{clientportal}/{controller}/{action}/{id}", // URL with parameters
new { controller = "ClientPortalHome", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults,
);
我的问题是如何确定请求了哪个客户端门户(上例中的client1)
我试着用这个:
private void Application_BeginRequest(Object source, EventArgs e)
{
var route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(Context));
var currentPortal = route.GetRequiredString("clientportal");
Context.Items.Add("ClientPortalName", currentPortal);
}
问题是对所有路由调用它,并对主控制器案例抛出异常,因为路由不包含“clientportal”条目
确定已请求哪个门户的最佳方法是什么,这样我就可以确保它存在并显示特定于客户端的主页?我需要自定义路由处理程序吗
先谢谢你
里克这应该是可行的:
private void Application_BeginRequest(Object source, EventArgs e)
{
var route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(Context));
object currentPortal;
if(route.Values.TryGetValue("clientportal", out currentPortal))
{
Context.Items.Add("ClientPortalName", currentPortal);
}
}
你们觉得一个路线管理员怎么样?与应用程序需求相比,这种方法的优缺点是什么
public class PortalRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var portalName = requestContext.RouteData.GetRequiredString("clientportal");
if (!string.IsNullOrWhiteSpace(portalName))
{
// Grab the portal details from the database
var portalEntity =
Repository.For<ClientPortalEntity>().GetAll().Where(x => x.PortalTag == portalName).First();
if (portalEntity != null)
{
// Register db object for use by controllers
IoC.Container.RegisterInstance<ClientPortalEntity>(portalEntity);
}
}
// Return the default MVC HTTP handler for the configured request
return new MvcHandler(requestContext);
}
}
公共类PortalRouteHandler:IRoutHandler
{
公共IHttpHandler GetHttpHandler(RequestContext RequestContext)
{
var portalName=requestContext.RouteData.GetRequiredString(“clientportal”);
如果(!string.IsNullOrWhiteSpace(portalName))
{
//从数据库中获取门户详细信息
无功转移=
Repository.For().GetAll().Where(x=>x.PortalTag==portalName.First();
if(可移植性!=null)
{
//注册数据库对象以供控制器使用
IoC.Container.RegisterInstance(可移植性);
}
}
//返回配置请求的默认MVC HTTP处理程序
返回新的MvcHandler(requestContext);
}
}
为什么您需要了解HomeController上的clientportal?是否有特定于客户端的内容?我问这个问题,因为您有一个特定于客户端的HomeController(ClientPortalHome),HomeController不需要它,但ClientPortalHomeController和其他一些控制器需要它。我计划为所有客户端门户主页配备一个控制器。是的,我需要从数据库中提取并显示一些特定于客户端的内容(css、文本和jpg)。我编辑这篇文章是为了更清楚地了解错误。我忘记了TryGet!谢谢您将如何处理其他控制器--此路由加载clientportal控制器。您又忘记了TryGetValue…:-)我在看到你的帖子之前实现了代码。很抱歉哪种方法更好?另外,如果输入了错误的门户名称,如何显示错误页面?我不确定,哪种解决方案更好。。。在我看来,他们是相当平等的。我会选择第一种方法(global.asax),因为我把它们都放在一个地方,否则,使用第二种方法,关注点可能会更好地分开…对于第二个问题:您可以使用动作PortalNotFound或类似的东西实现ErrorController。然后签入您的检查,如果portalEntity不为null,则添加一个else子句,并重定向到“/Error/PortalNotFound”。我不确定它是否有效,但您可以尝试直接修改路由值。