ASP.NET Маршрутизация MVC, Html.BeginForm

#c# #asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-routing

#c# #asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-маршрутизация

Вопрос:

 <% using (Html.BeginForm("SearchByZip", "Dealer", new { zip = ""}, FormMethod.Get))
  { %>
<div>
<input type="text" class="padLeft" name="Zip" id="Zip" style="width: 200px" />
<input type="submit" class="btnFind" value="Find" />
</div>
<% } %>
  

Это дает мне URL «Dealer / SearchByZip?Zip = 12345»
Я хотел бы закончить этим: «Dealer / Zip / 12345»
(если я вручную введу URL-адрес «Dealer / Zip / 12345», он вернет правильные результаты, но когда я нажимаю «Отправить», появляется «Dealer / SearchByZip? Zip = 12345»
Чего я не понимаю?

 routes.MapRoute(
            "DealerSearchByZip",
            "Search/Zip/{zip}",
            new { Controller = "Dealer", action = "SearchByZip", zip = "" }
         );
  

Ответ №1:

Это происходит потому, что «Zip» — это поле ввода в вашей форме, а не данные маршрута. Итак, при визуализации страницы создается URL-адрес с использованием маршрута по умолчанию (маршрут «DealerSearchByZip» не был сопоставлен, поскольку Zip не был указан в качестве данных маршрута).

Вы могли бы выполнить это с помощью javascript, обновив атрибут «action» в форме при обновлении поля «zip». Пример использования jQuery:

 $('input[name=Zip]').update(function(){
    $('form').attr('action', 'Dealer/Zip/'   $(this).val());
});
  

Или, поскольку Zip — это единственное значение, о котором вы беспокоитесь,

 $('form').submit(function(){
    window.location = 'Dealer/Zip/'   $('input[name=Zip]').val();
});