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>

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

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


person Kurt Johnson    schedule 27.02.2012    source источник


Ответы (2)


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

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

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

person Darin Dimitrov    schedule 27.02.2012
comment
Сделал это изменение, но оно еще не сработало. копаю дальше. - person Kurt Johnson; 27.02.2012
comment
Похоже, что это ошибка. - person Kurt Johnson; 28.02.2012
comment
Да, это ошибка. Я не смог воспроизвести его, потому что использовал более новую версию MVCContrib с ASP.NET MVC 3, где атрибут [ActionLinkArea] работает нормально. - person Darin Dimitrov; 28.02.2012
comment
Спасибо за внимание и за использование нового атрибута. Я все еще изучаю Mvc Areas и вижу в этом полезность. Мое решение на данный момент должно состоять в том, чтобы использовать перегрузку строки. Мех. - person Kurt Johnson; 28.02.2012

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

  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(), и она правильно выводит ссылку.

person Kurt Johnson    schedule 27.02.2012