【问题标题】:MVC3 Site Builder Application DesignMVC3 站点生成器应用程序设计
【发布时间】:2012-07-09 07:02:52
【问题描述】:

如果有人能帮助我解决这个问题,那就太好了,因为我是 Web 开发和 ASP.NET MVC 的新手。我的目标是设计一个可以帮助用户创建自己的迷你网站的 MVC 应用程序。每个用户都将拥有自己的迷你网站和管理面板来更改其网站的页面和模板。我认为那里有脚本可以实现类似的东西,但我们需要根据我们的特定要求创建自己的脚本 为了实现这个目标,我创建了一个主 mvc 3 应用程序,并在其下创建了一个区域作为站点。我们希望用户拥有自己的子域 URL,例如 www.site1.mainsite.com,其中 site1 是用户的迷你站点的名称。为此,我添加了 2 条路线,一条用于主站点,另一条用于区域,例如

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 个区域,一个是站点管理员,另一个是博客。 实现这一目标的最佳方法应该是什么?

  • 子域网址应该指向区域“站点”
  • 子域 url/Admin 应该被路由到区域“siteadmin”
  • 域/博客应该被路由到博客区域。
  • 域其他 url 应由主控制器处理

提前致谢

【问题讨论】:

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


    【解决方案1】:

    我什至没有得到一个回复​​ :( 但我尝试使用这些路线并取得了一些接近我所寻找的东西。 感谢 Route Debugger,它帮助我了解了路由出了什么问题

    当我尝试添加另一个区域“管理员”,并使用下面的路线注册时

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多