Html.BeginForm теряет значения маршрута с FormMethod.GET
Я заметил, что метод Html.BeginForm() кодирует предоставленные routeValues в атрибут действия тега 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 ответ
Как вы можете видеть, сгенерированный HTML является "правильным" и имеет семантику, которую вы хотите, так что это не проблема на стороне сервера, а проблема на стороне клиента. В этом случае браузер удаляет часть запроса из URL-адреса действия, а вы ожидаете, что он вместо этого добавит запрос. Если вы читаете спецификацию, действие не должно содержать запрос (это URI, а не URL), поэтому фактически вы попадаете в "ограничение" спецификации HTTP.
Вы перенаправлены на пустой URL без запроса, потому что в имеющемся HTML нет ничего для отправки. Попробуйте указать имя и значение для поля отправки или добавьте скрытое поле, и вы увидите, что параметры передаются в запросе.
Вы должны обязательно использовать скрытые поля в этом случае.