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

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

Например

Метод действия в 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.

Это поведение не поддерживается или я что-то упустил?

EDIT : Для ясности, форма в представлении Show для контроллера Employee содержит форму, которая отправляется на другой контроллер. Мы можем назвать это Group.

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

/Groups/Create/0/0

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 17 марта 2010

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

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

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

2 голосов
/ 18 марта 2010

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

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

0 голосов
/ 19 ноября 2013

У меня была похожая проблема, конфигурация 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))

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

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

0 голосов
/ 19 ноября 2013

После того, как вы перейдете в представление «Создать», значения маршрута, используемые для его получения, необходимо повторно опубликовать в действии публикации.

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

0 голосов
/ 19 ноября 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...