这是一个在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`
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中也可以使用
答案 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相互覆盖。