ASP.NET MVC - метод действия POST с дополнительными параметрами из URL

С ASP.net MVC возможно POST-форму для действия контроллера, которая включает параметры не в форме, а из URL?

Например

Метод Action в GroupController:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(int idOne, int idTwo, Model model)
    { ... }

Маршрут:

"{controller}/{action}/{idOne}/{idTwo}"

Отправленный URL:

/Employee/Show/1/42

В этом примере форма отправляется на другой контроллер, модель имеет правильное значение, однако другие параметры имеют значения по умолчанию 0.

Поведение, которое я ожидал, заключается в том, что ModelBinder увидит, что у меня есть два параметра, которые соответствуют данному маршруту, и присваивают текущим значениям 1 и 42 параметрам таким же образом, как работает GET.

Не поддерживается ли это поведение, или я что-то не хватает?

ИЗМЕНИТЬ: Чтобы быть ясным, форма в представлении Show для контроллера Employee содержит форму, которая отправляется на другой контроллер. Мы можем назвать его Group.

URL-адрес действия формы выглядит следующим образом

/Groups/Create/0/0

Форма объявляется следующим образом

Html.BeginForm("Create", "Groups")

После нескольких перегрузок для Html.BeginForm я обнаружил, что параметры отображаются только в том случае, если URL-адрес действия формы совпадает с текущим URL-адресом в адресной строке браузера.

Итак, если я перейду к URL /Groups/Create/1/42, у меня будет новая форма. Если я затем отправлю форму, значения маршрута URL будут переданы в действие POST.

Ответ 1

Если я правильно понял ваш вопрос, вы хотите, чтобы action отображаемого элемента <form> указывал URL, содержащий значения маршрута. Это должно быть возможно с одной из перегрузок метода расширения HtmlHelper.BeginForm():

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post);

Дайте мне знать, если у меня возникли все ваши вопросы:)

Ответ 2

Я уверен, что вы можете отправлять только данные формы из входов внутри формы. Рассматривали ли вы представление представления таким образом, чтобы вводить значения формы из URL-адреса (возможно, с помощью HTML-помощника?).

ОБНОВЛЕНИЕ: Если вы вообще не хотите использовать форму, используйте ControllerContext.RouteData.Values["idOne"], а не передавайте ее через подпись метода.

Ответ 3

Недавно у меня тоже была эта проблема, и потому, что у меня был другой маршрут, она была сопоставлена ​​с маршрутом по умолчанию, не принимая во внимание дополнительные параметры маршрута, которые я проходил.

Чтобы заставить его работать быстро, я написал форму, используя теги формы, и использовал @Url.Action для создания требуемого действия.

Ответ 4

Как только вы перейдете к вашему представлению "Создать", ваши значения маршрута, используемые для его получения, должны быть повторно отправлены в действие post.

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

Ответ 5

У меня была аналогичная проблема, конфигурация RouteConfig решила эту проблему.

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
             ...
             routes.MapRoute(
             "MyRoute",
             "{controller}/{action}/{idOne}/{idTwo}",
             new
             {
                 controller = "Employee", // as an example
                 action = "Show",
                 idOne = UrlParameter.Optional,
                 idTwo= UrlParameter.Optional
             }, new { idOne = @"\d{1,5}" });

        }
    }

... И...  Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post))

Записывает тег открытия ответа. Когда пользователь отправляет форма, запрос будет обработан целевым объектом маршрута. Этот член перегружен. Для получения полной информации об этом члене, включая синтаксис, использование и примеры, щелкните имя в перегрузке список.

И все работает