Html.BeginForm теряет routeValues ​​​​с FormMethod.GET

Я заметил, что метод Html.BeginForm() кодирует предоставленные routeValues в атрибут action тега FORM. Это хорошо работает с методом POST. Но если метод GET, все параметры URL-адреса действия удаляются браузером (проверено на IE8 и Firefox 3.0.7).

Например, этот код в поле зрения

<%
    using (Html.BeginForm("TestAction", "TestController", new { test = 123 }, 
        FormMethod.Get)) 
    {
        Response.Write("<input type='submit'>");
    };
%>

дает такой HTML

<form action="/TestController/TestAction?test=123" method="get">
    <input type='submit'>
</form>

Но после отправки формы URL стал /TestController/TestAction, а не /TestController/TestAction?test=123 (параметр потерян).

Теперь я использую группу вызовов Html.Hidden() вместо параметра routeValues, но мне интересно, есть ли другой обходной путь? Следует ли это рассматривать как ошибку в MVC, которая когда-нибудь будет исправлена?


person Alexander Prokofyev    schedule 21.05.2009    source источник
comment
Можете ли вы прояснить вашу проблему? Вы пытаетесь отправить форму, используя GET вместо POST? Можете ли вы привести пример?   -  person Johannes Setiabudi    schedule 21.05.2009


Ответы (1)


Как видите, сгенерированный HTML является «правильным» и имеет нужную вам семантику, так что это проблема не на стороне сервера, а на стороне клиента. Браузер в этом случае удаляет часть запроса из URL-адреса действия, в то время как вы ожидали, что вместо этого он будет добавлен к запросу. Если вы читаете спецификацию, действие не должно содержать запрос (это URI, а не URL), так что на самом деле вы попадаете в «ограничение» спецификации HTTP.

Вы направляетесь к голому URL-адресу без запроса, потому что в HTML у вас нет ничего для отправки. Попробуйте указать имя и значение в поле отправки или добавить скрытое поле, вы увидите, что параметры передаются в запросе.

В этом случае вам обязательно следует использовать скрытые поля.

person Palantir    schedule 27.10.2009
comment
Интересно, почему HTML-помощник ASP.NET MVC BeginForm() сам не отображает скрытые поля при выборе метода GET? - person Alexander Prokofyev; 28.10.2009
comment
В качестве альтернативы создайте конкретное определение маршрута, чтобы значение test добавлялось как сегмент маршрута, а не как строка запроса, и в этом случае вам не нужен скрытый ввод. - person ; 08.11.2017