MvcContrib - строго типизированные маршруты перегрузки BeginForm к переносимой области вместо использования маршрута

Я использую MvcContrib 2.0.95.0 в сети MVC2. Мы создали переносимые области и используем их на странице.

На моей странице просмотра, которая использует виджет из моей портативной области, я заметил, что BeginForm направляет мои сообщения в мою портативную область.

using (Html.BeginForm<MyController>(f => f.SomeResult(null), FormMethod.Post){
}

Это дает следующий маршрут. Обратите внимание на пользовательскую область в маршруте:

<form action="/Custom/My/SomeResult" class="observeform" id="SomeForm" method="post">
....

</form>

Для сравнения я поместил перегруженную строку BeginForm над ней:

using(this.Html.BeginForm("SomeResult", "My"))
{

Моя портативная зона не обладает этим на контроллере, поэтому я не понимаю, почему она будет направляться сюда.

... и он дал следующий правильный маршрут:

<form action="/My/SomeResult" method="post">
....
</form>

Моя переносимая область содержит ограничения пространства имен, тогда как маршрутизация моего потребляющего приложения - нет.

Не прибегая к перегрузкам строк в моих ссылках и создании форм, как я могу предотвратить перенос моей рабочей области из-за маршрутизации моего потребляющего приложения?

2 ответа

Попробуйте украсить свой контроллер с [ActionLinkArea] атрибут и укажите пустую строку, чтобы указать, что этот контроллер принадлежит корневому сайту, а не какой-либо области:

[Microsoft.Web.Mvc.ActionLinkArea("")]
public class MyController : Controller
{
    ...
}

Теперь Html.BeginForm<MyController> помощник сгенерирует ожидаемый результат.

Чтобы решить, я предпринял следующие шаги.

  1. Получил последний исходный код Mvc2 Futures
  2. Изменена ссылка System.Web.Mvc для использования библиотеки GAC, а не ссылка на проект.
  3. Отредактировал следующий файл: Microsoft.Web.Mvc.LinkBuilder, строка 21:

    // changed this
    VirtualPathData vpd = routeCollection.GetVirtualPath(context, routeValues);
    
    // to this
    VirtualPathData vpd = routeCollection.GetVirtualPathForArea(context, routeValues);
    
  4. После того, как я перекомпилировал и развернул dll в своем проекте, я реорганизовал свой код формы обратно в строго типизированную перегрузку BuildForm(), и он вывел ссылку правильно.

Другие вопросы по тегам