MVC3站点构建器应用程序设计

时间:2012-07-09 20:24:04

标签: asp.net-mvc asp.net-mvc-3 model-view-controller asp.net-mvc-routing

如果有人可以帮我解决这个问题,那将是很棒的,因为我是Web开发和ASP.NET MVC的新手。我的目标是设计一个MVC应用程序,可以帮助用户创建自己的迷你网站。每个用户都将获得自己的迷你网站和管理面板来更改其网站的页面和模板。我认为有一些脚本可以实现类似的功能,但我们需要为我们的特定需求创建自己的脚本 为了实现这个目标,我创建了一个主要的mvc 3应用程序,并在其下创建了一个Site作为Site。我们希望用户拥有自己的子域名网址,例如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;
到目前为止它的工作,但我不认为它是一个很好的设计。现在除此之外,我需要再添加2个区域,一个是siteadmin,另一个是博客。 什么应该是实现这一目标的最佳方式?

  • 子域名网址应定向到“site”区域
  • 子域名网址/管理员应路由到“siteadmin”区域
  • 域/博客应该路由到博客区域。
  • 域名其他网址应由主控制器处理

提前致谢

1 个答案:

答案 0 :(得分:1)

我甚至没有得到一个回复​​:(但我试着玩这些路线,并取得了一些接近我正在寻找的东西。 感谢路由调试器,它帮助我了解了路径出了什么问题

当我尝试添加另一个区域“Admin”,并使用以下路线注册时

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);
    }
}

这种方法帮助我在全球法律中按照所需顺序注册了区域

 RouteHelper.RegisterArea<SiteAdminAreaRegistration>(RouteTable.Routes, null);
 RouteHelper.RegisterArea<SiteAreaRegistration>(RouteTable.Routes, null);

我正在写下来,到目前为止,我得到的答案是其他人可能会发现它有用。