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>
помощник сгенерирует ожидаемый результат.
Чтобы решить, я предпринял следующие шаги.
- Получил последний исходный код Mvc2 Futures
- Изменена ссылка System.Web.Mvc для использования библиотеки GAC, а не ссылка на проект.
Отредактировал следующий файл: Microsoft.Web.Mvc.LinkBuilder, строка 21:
// changed this VirtualPathData vpd = routeCollection.GetVirtualPath(context, routeValues); // to this VirtualPathData vpd = routeCollection.GetVirtualPathForArea(context, routeValues);
После того, как я перекомпилировал и развернул dll в своем проекте, я реорганизовал свой код формы обратно в строго типизированную перегрузку BuildForm(), и он вывел ссылку правильно.