MVC - маршрут не регистрируется - PullRequest
0 голосов
/ 02 октября 2018

Это проблема, которая довольно часто встречается здесь на SO, но пока ни одно из найденных решений не решило проблему для меня.Примеры следующих ссылок:

Однако моя проблема заключается в следующем: для области доходов полная маршрутизация и все работает.URL-адрес также правильный, как /Revenues/Revenue/Unconfirmed. Для области Campaigns ссылка action всегда остается в виде пустой ссылки, поэтому она не обрабатывается и, таким образом, при щелчке создает URL-адрес, такой как current page/#.Однако если файл Revenues.dll отсутствует в моем приложении, он отображает ссылку для действия (для обеих областей) как /Controller/Action?area=AreaName

Макет проекта (MVC)

`

Solution
   | Main MVC APP (does only authentication)
       | Models
       | Controllers
       | Views
       | Areas (this are hidden MVC projects)
       | global.asax 
       | ...
   | Modules (just an folder with all the projects of each area in it)
       | Campaigns 
          | Models
          | Controllers
          | Views
       | Revenues
          | Models
          | Controllers
          | Views`

enter image description here

  • Каждая область является отдельным проектом и связана с основным решением.
  • Каждая областьбудет скомпонован как .dll и затем связан с приложением Main MVC
  • Все модели находятся в пространстве имен -> CustomerPortal.Models, для остальных у каждой области есть свое пространство имен.
  • Представления внутри областей настроены как Embedded resource, так как в противном случае локализации с файлами ресурсов не хотели работать правильно.URL-адрес для просмотра соответствует следующему пути ~/Area/Controller/Action

Образцы кода

Основное приложение MVC

RouteConfig.cs

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

        AreaRegistration.RegisterAllAreas();
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Portal", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "CustomerPortal.Controllers" }
        ).DataTokens["UseNamespaceFallback"] = false;
    }

_Menu.cshtml

<li class="treeview">
        <a href="#">
            <i class="fa fa-users"></i> <span>Campaigns</span>
            <span class="pull-right-container">
                <i class="fa fa-angle-left pull-right"></i>
            </span>
        </a>
        <ul class="treeview-menu">
            <li>@Html.ActionLink("Reactions", "CampaignResponses", "Campaign", new { area = "Campaigns" }, new { })</li>
        </ul>
    </li>
    <li class="treeview">
        <a href="#">
            <i class="fa fa-bar-chart"></i> <span>Revenues</span>
            <span class="pull-right-container">
                <i class="fa fa-angle-left pull-right"></i>
            </span>
        </a>
        <ul class="treeview-menu">
            <li>@Html.ActionLink(Title.Unconfirmed, "Unconfirmed", "Revenue", new { area = "Revenues" }, new { })</li>
            <li>@Html.ActionLink(Title.RevenueConfirmed, "Confirmed", "Revenue", new { area = "Revenues" }, new { })</li>
        </ul>
    </li>

Доходы

ДоходыAreaRegistration.cs

namespace Revenues {
public class RevenuesAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Revenues";
        }
    }
    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Revenues_default",
            "Revenues/{controller}/{action}/{id}",
            new { controller = "Revenue", action = "Index", id = UrlParameter.Optional },
            new string[] { "Revenues.Controllers" }
        );
    }
}

}

RevenueController.cs

namespace Revenues.Controllers
{
    [Authorize]
    [RouteArea("Revenues")]
    public class RevenueController : Controller
    {
       public ActionResult Unconfirmed() {
       ...

Кампании

CampaignsAreaRegistration.cs

namespace Campaigns
{
    public class CampaignsAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Campaigns";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Campaigns_default",
                "Campaigns/{controller}/{action}/{id}",
                new { controller = "Campaign", action = "CampaignResponses", id = UrlParameter.Optional },
                new string[] { "Campaigns.Controllers" }
            );
        }
    }
}

CampaignController.cs

namespace Campaigns.Controllers
{
    [Authorize]
    [RouteArea("Campaigns")]
    public class CampaignController : Controller
    {
        public ActionResult CampaignResponses()
        {
            SetData();
            return View();
        }

Надеюсь, кто-то увидит то, на что я смотрю.Уже почти сутки занимаемся поиском неисправностей и неудачей, но решение для них так и не найдено ...

РЕДАКТИРОВАТЬ

После более глубокого поиска с помощью следующего кодаЯ обнаружил, что он регистрирует только основные приложения MVC и маршруты доходов.Кампании вообще не зарегистрированы.Но до сих пор нет понятия, почему это происходит.

public override void Init()
        {
            base.Init();
            this.AcquireRequestState += ShowRouteValues;
        }

        protected void ShowRouteValues(object sender, EventArgs e)
        {
            var context = HttpContext.Current;
            if (context == null)
            {
                return;
            }
            var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(context));
        }

EDIT 2

Кажется, что .dll не регистрируется в основном приложении MVC.Я забыл сказать, что все это работает на Azure в качестве службы приложений.

Но теперь я зарегистрировал маршрут непосредственно в RouteConfig.cs из MainApp, однако он регистрирует полный маршрут в actionlink, однаковсе еще не находит действие Контроллера тогда.Так что это должно быть проблемой с .dll.Это было добавлено в качестве ссылки на основной проект и также доступно в службе приложений

1 Ответ

0 голосов
/ 04 октября 2018

Наконец, после 2 дней поиска проблемы, я смог ее решить.

Все маршруты, показанные выше, проекты и т. Д. Верны, и в них ничего не происходит.Проблема, однако, была в используемой версии MVC в разных проектах.CustomerPortal и Revenues использовали System.Web.MVC версии 5.2.3, однако все новые проекты использовали более новую версию 5.2.4.Так что по какой-то причине это различие версий не хотело работать.

РЕДАКТИРОВАТЬ

искали причину, по которой этот случай происходил, так как, на мой взгляд, разныеВерсия .dll не должна быть причиной этого.Когда я внимательно посмотрел на релизы system.Web.MVC, я увидел, что у них было 4 новых релиза в том же месяце.Просматривая заметки о выпуске и текущие открытые проблемы, я обнаружил эту проблему: https://github.com/aspnet/AspNetWebStack/issues/172

Итак, в данный момент в MVC есть ошибка, которая заставляет AreaRegistrations перезаписывать друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...