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))
Записывает тег открытия ответа. Когда пользователь отправляет форма, запрос будет обработан целевым объектом маршрута. Этот член перегружен. Для получения полной информации об этом члене, включая синтаксис, использование и примеры, щелкните имя в перегрузке список.
И все работает