MVC-路由未注册

时间:2018-10-02 15:23:43

标签: c# asp.net-mvc-5

这是一个在SO上很常见的问题,但是到目前为止,没有找到的解决方案为我解决了这个问题。以下链接的示例:

但是,我的问题是:对于收入区域,完整的路由和所有功能都可以正常工作。网址也正确为/Revenues/Revenue/Unconfirmed 对于“广告系列”区域,操作链接始终始终为空href,因此不会被呈现,因此在单击时创建了current page/#之类的URL。但是,当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 APP

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>

收入

RevenuesAreaRegistration.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();
        }

我希望有人能看到我的看法。已经进行了将近一天的跟踪与失败,但仍然没有找到解决方案...

编辑

在使用以下代码进行了更深入的搜索之后,我发现它仅注册了Main MVC App和Revenues路由。这些活动根本没有注册。但是到目前为止,还不知道为什么会这样。

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

编辑2

.dll似乎未在主MVC应用中注册。 我忘了说这一切都是作为azure作为App Service运行的。

但是我现在已经从MainApp直接在RouteConfig.cs中注册了路由,这将完整的路由注册到actionlink中,但是,它仍然找不到Controller动作。因此,.dll必须是一个问题。 这已添加为对主要项目的参考,并且在App Service中也可以使用

1 个答案:

答案 0 :(得分:0)

最后,经过2天的搜索,我终于能够解决问题。

上面显示的所有路线,项目等都是正确的,并且没有任何故障。 但是,问题出在不同项目中使用的MVC版本中。 CustomerPortal和Revenues都使用System.Web.MVC版本5.2.3,但是所有新项目都使用更新的版本5.2.4。因此出于某些原因,版本的这种差异不起作用。

编辑

一直在寻找发生这种情况的原因,因为在我看来,不同版本的.dlls不应是造成这种情况的原因。 当我仔细查看system.Web.MVC的发行版时,我发现它们在同一个月内有4个新发行版。查看发行说明和当前的未解决问题时,我发现了以下问题: https://github.com/aspnet/AspNetWebStack/issues/172

因此,目前MVC中存在一个错误,该错误导致AreaRegistrations相互覆盖。