如果有人能帮我解决这个问题,那就太好了,因为我是web开发和ASP.NET MVC的新手。我的目标是设计一个MVC应用程序,它可以帮助用户创建自己的迷你网站。每个用户都将获得自己的迷你网站和一个管理面板来更改网站的页面和模板。我认为有一些脚本可以实现类似的目标,但我们需要根据自己的具体需求创建自己的脚本为了实现这个目标,我创建了一个主mvc 3应用程序,并在它下面创建了一块区域作为Site。我们希望用户拥有自己的子域URL,如www.site1.mainsite.com,其中site1是用户的迷你网站的名称。为此,我添加了两条路线,一条用于主站,另一条用于等区域
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "MainSite.UI.Controllers" }
);
区域内注册
context.MapRoute(
"Sites_default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new {controller = new SiteConstraint()},
new[] { "MainSite.UI.Areas.Site.Controllers" });
它们都有相同的url类型,但区域路由有一个限制,我添加了这个限制,比如
var url = httpContext.Request.Headers["HOST"];
var storeName = url.Split('.')[1];
var match = storeName != "mainsite";
return match;
到目前为止是可行的,但我认为这不是一个好的设计。现在除此之外,我还需要添加两个区域,一个是网站管理员,另一个是博客。实现这一目标的最佳方式是什么?
- 子域url应指向区域"site"
- 子域url/Admin应路由到区域"siteadmin"
- 域/博客应该路由到博客区域
- 域其他url应由主控制器处理
提前感谢
我甚至没有得到一个回复:(但我试着玩这些路线,并取得了一些接近我想要的成绩。多亏了路由调试器,它帮助我了解了路由的问题
当我尝试添加另一个区域"管理员",并在下面的路线上注册时
context.MapRoute(
"SiteAdmin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional },
new { controller = new SiteConstraint() },
new[] { "MainSite.UI.Areas.SiteAdmin.Controllers" }
);
事情开始出问题了。Route Debugger帮助我弄清楚发生了什么。对我来说,路线的顺序真的很重要,所以我必须确保我所在的地区按照正确的顺序登记。
AreaRegistration.RegisterAllAreas()
没有按正确的顺序注册我的路线,谷歌给了我这个帮助方法。
public static class RouteHelper
{
public static void RegisterArea<T>(RouteCollection routes, object state) where T : AreaRegistration
{
var registration = (AreaRegistration)Activator.CreateInstance(typeof(T));
var context = new AreaRegistrationContext(registration.AreaName, routes, state);
var tNamespace = registration.GetType().Namespace;
if (tNamespace != null)
{
context.Namespaces.Add(tNamespace + ".*");
}
registration.RegisterArea(context);
}
}
这种方法帮助我在Global asax中按要求的顺序将区域注册为
RouteHelper.RegisterArea<SiteAdminAreaRegistration>(RouteTable.Routes, null);
RouteHelper.RegisterArea<SiteAreaRegistration>(RouteTable.Routes, null);
我把它写下来,我得到的只是一个答案,这样其他人可能会觉得它有用。