MVC идет в неправильный вид, используя область в MVC - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть название области HR.вот HRAreaRegistration.CS

namespace WebApplication1.Areas.HR
{
    public class HRAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "HR";
            }
        }

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

        }
    }
}

в RouteConfig.cs

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

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "WebApplication1.Controllers" }
            );
        }
    }

Я надеялся, что, поскольку я расставил приоритеты в пространстве имен основного контроллера, когда я иду в Home / Index, я попаду впросмотр и контроллер HomeController / Index.Вместо этого я иду к контроллеру дома в области HR.HR / HomeController / Index.не уверен, что я делаю неправильно.

здесь находится контроллер дома (тот, который я хотел бы нажать, когда я иду в Home / Index)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;

    namespace WebApplication1.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                return View();
            }

, а вот контроллер дома вобласть hr (та, которую я бью, когда я иду в Home / Index, хотя я не должен быть)

 using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;

        namespace WebApplication1.Areas.HR.Controllers
        {
            public class HomeController : Controller
            {
                // GET: HR/Home
                public ActionResult Index()
                {
                    return View();
                }
            }
        }

/ *********** Редактирование моего вопроса в ответв pfx ответ ******************** /

для этого приложения, если задана определенная переменная, то страница по умолчанию должна находиться в области HR.В частности, область HR Контроллер OST Индекс действия.поэтому все следующее должно привести нас к этому представлению.

http://nrdephrs01/hrpa
http://nrdephrs01/hrpa/ost
http://nrdephrs01/hrpa/ost/index
http://nrdephrs01/hrpa/hr/ost/
http://nrdephrs01/hrpa/hr/ost/index

теперь, когда они попадают на эту страницу по умолчанию, есть ссылка, которая ведет их к Users / Details / 1524, так что этот контроллер не находится вплощадь.это просто Controller = Users Action = Details.

Вот мои маршруты, которые работают, пока я не попытаюсь перейти к Users / Details / 1524, где он не может найти контроллер.

HRAreaRegistration

namespace Portal.UI.Areas.HR
{
    using System.Web.Mvc;

    public class HRAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "HR";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {

            context.MapRoute(
                "HR_default",
                "HR/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });

            // if the application is Out of State travel there will be an appsetting called OST set to true.
            // for OST applications have the main default page be HR/OST/Index
            string ost = System.Configuration.ConfigurationManager.AppSettings["OST"];

            if (ost == "true")
            {
                context.MapRoute(
                "Details",
                 "Users/{action}/{id}",
                 new { controller = "Users", action = "Index", id = UrlParameter.Optional });

                context.MapRoute(
                 "HR_default1",
                  "{controller}/{action}/{id}",
                  new { controller = "OST", action = "Index", id = UrlParameter.Optional });
            }
        }
    }
}

и вот RouteConfig.cs

{
    using System.Web.Mvc;
    using System.Web.Routing;

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

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
        }
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

Из комментариев, которые я прочитал, вы хотите, чтобы http://localhost:50908/HRHome/Index обрабатывался HRHomeController в области HR.

Для этого вы должны определить явный маршрут в HRAreaRegistration.cs для HRHome, заменив {controller} на HRHome в шаблоне маршрута.

Наличие этого маршрута с явным и уникальным шаблоном маршрута устраняет любые конфликты с другими маршрутами, в том числе из области по умолчанию.

Важно зарегистрировать этот маршрут из AreaRegistration вместо RouteConfig, иначе представления не будут разрешены из соответствующей папки views в области HR.

context.MapRoute(
    name: "HRHome"
    url: "HRHome/{action}/{id}",
    defaults: new { 
        controller = "HRHome", 
        action = "Index", 
        id = UrlParameter.Optional 
        },
    namespaces: new [] { "WebApplication1.Areas.HR.Controllers" }
    );

Полная регистрация области выглядит так:

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        name: "HRHome"
        url: "HRHome/{action}/{id}",
        defaults: new { 
            controller = "HRHome", 
            action = "Index", 
            id = UrlParameter.Optional 
            },
        namespaces: new [] { "WebApplication1.Areas.HR.Controllers" }
        );


    context.MapRoute(
        name: "HR_default"
        url: "HR/{controller}/{action}/{id}",,
        defaults: new { 
            controller = "HRHome", 
            action = "Index", 
            id = UrlParameter.Optional 
            },
        namespaces: new [] { "WebApplication1.Areas.HR.Controllers" }
        );
}
...