Почему Html.BeginForm генерирует пустое действие? - PullRequest
9 голосов
/ 16 июня 2011

У меня есть контроллер в области под названием Admin

public class SiteVisitController : Controller
{
    public ViewResult ReadyForCompletion() { ... }

    public ViewResult CompleteAndExport() { ... }
}

и представление (ReadyForCompletion.cshtml), которое отправляет сообщения в другое действие контроллера в том же классе

@using (Html.BeginForm( "CompleteAndExport", "SiteVisit" ))
{        
    <input type="submit" value="Complete &amp; Export" />
}

Сгенерированный HTML-код для этой формы содержит пустое действие:

<form action="" method="post">  <input type="submit" value="Complete &amp; Export" />

</form>

Я хочу знать , почему в этом поле отсутствует действие? Для получения дополнительной информации я также добавил в

@Url.RouteUrl(new { controller = "ReadyForCompletion", action = "SiteVisit", area = "Admin" })

, который также распечатал пустую строку. Кроме того, если я использую пустой Html.BeginForm(), он генерирует правильное действие.

Зарегистрированные маршруты:

        context.MapRoute(
            "Admin_manyParams",
            "Admin/{controller}/{action}/{id}/{actionId}",
            new { action = "Index", id = UrlParameter.Optional, actionId = UrlParameter.Optional }
        );

Ответы [ 2 ]

10 голосов
/ 16 июня 2011

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

См .: Эта статья, которая объясняет проблему

0 голосов
/ 17 февраля 2017

Для тех из вас, кто сталкивался с этой проблемой при использовании ASP.NET Core, основная причина та же, хотя решение немного отличается. Я впервые увидел это в Core, используя несколько значений по умолчанию при вызове .MapRoutes(). Э.Г.

routes.MapRoute(
    name: "default",
    template: "{controller}/{action}/{id?}",
    defaults: new { controller = "Foo", action = "Bar" }
);

Обходной путь - поместить значения по умолчанию в шаблон строки:

routes.MapRoute(
    name: "default",
    template: "{controller=Foo}/{action=Bar}/{id?}"
);

YMMV.

...