Форма перенаправления mvc.net получить лучший подход к 'красивому' URL

В настоящее время у меня есть коллекция таких маршрутов, как

{controller} / {action} / {from} / {to} / {some} / {other} / {things}
{controller} / {action} / {from} / {to} / {some} / {другой}
{контроллер} / {действие} / {от} / {к}
{контроллер} / {действие}

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

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

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


person Lbp    schedule 21.12.2009    source источник


Ответы (2)


Форма всегда будет кодировать параметры как строку запроса. Если вы хотите, чтобы клиент выдавал красивый 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, ... )
 {
     ...
 }
person tvanfosson    schedule 21.12.2009

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

person Lbp    schedule 21.12.2009