3

如果有人可以帮助我解决这个问题,那就太好了,因为我是 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 应由主控制器处理

提前致谢

4

1 回答 1

1

我什至没有得到一个回复

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

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

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

于 2012-07-11T20:24:07.313 回答