Html.BeginForm теряет значения маршрута с FormMethod.GET - PullRequest
7 голосов
/ 21 мая 2009

Я заметил, что метод 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, которая когда-нибудь будет исправлена?

1 Ответ

7 голосов
/ 27 октября 2009

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

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

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

...