Как указать область по умолчанию без добавления области = "" для каждого ActionLink

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %>

Ответ 2

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

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