Как указать область по умолчанию без добавления area = "" к каждому ActionLink - PullRequest
14 голосов
/ 27 февраля 2010

У меня есть большое существующее приложение, построенное на ASP.NET MVC2 RC2.

Все мои ссылки выглядят так: htp // site / controller / action / id

Я только что добавил область под названием: BigBird .

Теперь, когда я нахожусь в области BigBird, все мои ссылки выглядят так: htp: // site / BigBird / controller / action / id

Проблема в том, что ни один из этих контроллеров / действий не существует в моей новой области. Поэтому мне нужно просмотреть все мои ссылки действий по всему приложению и указать следующее значение маршрута: area = string.empty

Есть ли способ обойти это?

Ответы [ 2 ]

12 голосов
/ 08 марта 2010

Я не знаю, насколько это возможно, если вы используете стандартные методы MVC (кроме того, что вы можете переопределить их для вызова своей собственной версии), но если вы используете ActionLink<TController> или другие обобщенные методы, предоставленные в MvcFutures lib тогда можно.

Методы MvcFutures вызывают ExpressionHelper.GetRouteValuesFromExpression(), который ищет ActionLinkAreaAttribute на контроллере для определения области. Таким образом, вы можете украсить свои контроллеры в своей основной «области» следующим образом:

[ActionLinkArea("")]
[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Ссылки действий должны быть сгенерированы правильно, используя стандартный синтаксис:

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %>
0 голосов
/ 27 февраля 2010

Вы можете сделать одну из двух вещей. Вы можете либо переместить / скопировать ваши контроллеры / действия в соответствующую область, либо написать несколько новых контроллеров для новой области (этот подход я рекомендую), либо вы можете написать собственный маршрут, который принудительно вводит новую область в корень (который не рекомендую, поскольку это побеждает всю цель наличия областей):

routes.MapRoute(
    "BigBird_Override",                                             
    "BigBird/{controller}/{action}/{id}",                          
    new { area = String.Empty }
);
...