Форма перенаправления mvc.net - лучший подход к URL - PullRequest
1 голос
/ 21 декабря 2009

У меня сейчас есть коллекция маршрутов, таких как

{контроллер} / {действие} / {от} / {к} / {некоторые} / {другие} / {} вещи
{Контроллер} / {действие} / {от} / {к} / {некоторые} / {} другой
{Контроллер} / {действие} / {от} / {к}
{Контроллер} / {действие}

и представления с формами с действиями get для получения результатов. Но действия идут к маршрут по умолчанию / последний с параметрами в строках запроса. Каков наилучший подход для обработки перенаправления на симпатичный URL для наиболее конкретного маршрута? т.е. когда отправляемая форма отправляется myurl.com/controller/action?from=20091021&to=20091131 его перенаправили на myurl.com/controller/action/from-20091021/to-20091131

Как правило, мне интересно, упускаю ли я что-то фундаментальное из разумного проектирования маршрутов, поскольку у меня также есть небольшие проблемы с отображением Html.RouteLink на маршрут, а не с URL-адресами в стиле строки запроса.

Заранее спасибо за любые советы / рекомендации / полезные ссылки.

Ответы [ 2 ]

3 голосов
/ 21 декабря 2009

Форма всегда собирается кодировать параметры в виде строки запроса. Если вы хотите, чтобы клиент выдавал симпатичный URL GET, то вам нужно использовать обработчик отправки, а не создавать URL-адрес на стороне клиента. Если нормально иметь дополнительную обратную передачу, рассмотрите возможность использования POST и получите действие, которое принимает POST, восстанавливает URL и выполняет RedirectToAction для действия, которое принимает значения через GET.

на стороне клиента:

 $(function() {
     $('form').submit( function() {
         var params = [ $('from').val(), $('to').val(), ... ];
         location.href = $(this).attr('action') + '/' + params.join('/');
         return false;
     });
 $);

Серверный

 [AcceptVerbs( HttpVerbs.Post )]
 [ActionName( "MyAction" )]
 public ActionResult MyPostAction( string from, string to, ... )
 {
     // you may be able to simply reuse the RouteValueDictionary, but may
     // also need some transformations...
     return RedirectToAction( "MyAction", new { from = from, to = to, ... } );
 }

 [AcceptVerbs( HttpVerbs.Get )]
 public ActionResult MyAction( string from, string to, ... )
 {
     ...
 }
0 голосов
/ 21 декабря 2009

Aha! Я думаю, я обнаружил, что моя проблема с вещами на основе маршрута не возвращает ожидаемый маршрут - я указал значения по умолчанию для слишком многих маршрутов, и это тогда означало, что маршрут по умолчанию (последний) всегда совпадает - и каждый параметр заканчивается вверх в строке запроса.

...