Asp.net MVC 2 области.Только один будет работать - PullRequest
2 голосов
/ 11 декабря 2010

Это моя цель:

Мне нужно две (или более) "Области" для моего веб-приложения MVC.К ним можно получить доступ следующим образом:

/* Home */
http://example.com/
http://example.com/about
http://example.com/faq
http://example.com/contact

/* Admin */
http://example.com/admin
http://example.com/admin/login
http://example.com/admin/account
http://example.com/admin/ect

Я бы хотел бы организовать проект следующим образом:

MyExampleMVC2AreasProject/
    Areas/
        Admin/
            Controllers/
            Models/
            Views/
                Home/
                Shared/
                    Site.Master
                Web.Config
            AdminAreaRegistration.cs
        Web/
            Controllers/
            Models/
            Views/
                Home/
                Shared/
                    Site.Master
                Web.Config
            WebAreaRegistration.cs
    Global.asax
    Web.Config

Итак, в Global.asax у меня есть:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

        );
    }
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

Здесь WebAreaRegistration.cs

using System.Web.Mvc;

namespace MyExampleMVC2AreasProject.Areas.Web
{
    public class WebAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Web";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "WebDefault",
                "{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

«AdminAreadRegistration.cs» настроен так же, но параметр url равен Admin/{action}/{id}.

Снастройка выше Web «Area» прекрасно работает (example.com/about, example.com/contact и т. д.).

Что мне нужно сделать, чтобы получить Admin "Зона "подключена к маршрутам так, как я хочу? Я только что получил 404 ed сейчас.
Я пробовал каждую комбинацию маршрутов, маршрутов с пространствами имен, параметров URL, параметров по умолчанию и т. Д.,Я мог думать о. У меня такое ощущение, что я упускаю что-то довольно простое.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2010

Я использую этот класс AreaRegistrationUtil . Он автоматически регистрирует все, что наследует AreaRegistration в любой сборке, которую вы укажете. В качестве дополнительного бонуса, он намного быстрее, чем AreaRegistration.RegisterAllAreas, потому что он смотрит только на указанную вами сборку.

0 голосов
/ 01 апреля 2013

Вам, вероятно, нужно установить свои пространства имен для всех регистраций вашего региона.

Пример

context.MapRoute(
    "Admin_default",
    "admin/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new string[] { "MyExampleMVC2AreasProject.Areas.Admin.Controllers" } // This is area namespace
);
0 голосов
/ 28 декабря 2010

Мое текущее решение здесь: http://notesforit.blogspot.com/2010/08/default-area-mvc-2.html

Мне это не нравится, и я бы хотел найти лучшее решение.

- скопировано с URL выше:

Реализуйте свои Области как обычно, зарегистрируйте любые маршруты, которые вам нужны.

Например:

public class PublicAreaRegistration : AreaRegistration
  {
    public override string AreaName
    {
      get
      {
        return "Public";
      }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
      context.MapRoute(
        "Public_default",
        "Public/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional, }
      );
    }
  }

А:

public class AdminAreaRegistration : AreaRegistration
  {
    public override string AreaName
    {
      get
      {
        return "Admin";
      }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
      context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Overview", action = "Index", id = UrlParameter.Optional }
      );
    }
  }

Важно, чтобы у URL был любой префикс, например http://site.com/PREFIX/{controller}/{action},, потому что префикс по умолчанию Area будет обрезан

Далее через Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication
{
  public static string _defaultAreaKey = "DefaultArea";

  public static void RegisterDefaultRoute(RouteCollection routes)
  {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //reading parameter DefaultArea from web.config 
    string defaultArea = ConfigurationManager.AppSettings[_defaultAreaKey];

    //check for null
    if (String.IsNullOrEmpty(defaultArea)) 
      throw new Exception("Default area isn\'t set");

    //select routes from registered, 
    //which have DataTokens["area"] == DefaultArea
    //Note, each Area might have more than one route
    var defRoutes = from Route route in routes
            where
            route.DataTokens != null &&
            route.DataTokens["area"] != null && 
            route.DataTokens["area"].ToString() == defaultArea
            select route;


    //cast to array, for LINQ query will be done,
    //because we will change collection in cycle
    foreach (var route in defRoutes.ToArray())
    {
      //Important! remove from routes' table
      routes.Remove(route);

      //crop url to first slash, ("Public/", "Admin/" etc.)
      route.Url = route.Url.Substring(route.Url.IndexOf("/") + 1);

      //Important! add to the End of the routes' table
      routes.Add(route);
    }      
  }

  protected void Application_Start()
  {
    //register all routes
    AreaRegistration.RegisterAllAreas();

    //register default route and move it to end of table
    RegisterDefaultRoute(RouteTable.Routes);      
  }
}

Не забудьте добавить параметр в web.config:

<configuration>

 <appSettings>
  <add key="DefaultArea" value="Public"/>
 </appSettings>

<!-- ALL OTHER-->
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...