Это проблема, которая довольно часто встречается здесь на 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](https://i.stack.imgur.com/HPQQc.png)
- Каждая область является отдельным проектом и связана с основным решением.
- Каждая областьбудет скомпонован как .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.Это было добавлено в качестве ссылки на основной проект и также доступно в службе приложений