ASP.NET MVC – сопоставление более одного параметра строки запроса с красивым URL-адресом

StackOverflow https://stackoverflow.com/questions/417000

  •  03-07-2019
  •  | 
  •  

Вопрос

Я немного застрял в дизайне своих SEO-оптимизированных URL-адресов для MVC... Возьмем, к примеру, следующий URL-адрес:http://myapp/venues/resturants.aspx?location=central&orderBy=высший рейтинг

С помощью моего приложения MVC я сопоставил его следующим образом:http://myapp/venues/list/resturants/central/с самым высоким рейтингом
{контроллер}/{действие}/{категория}/{местоположение}/{порядок}

Теперь единственная проблема заключается в том, что местоположение и порядок не являются обязательными... поэтому должна быть возможность отправить запрос типа: http://myapp/venues/list/resturants/с самым высоким рейтингом .Это оказывается проблемой, когда запрос попадает в действие контроллера, параметр местоположения, естественно, получает «самый высокий рейтинг».

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

Кто-нибудь сталкивался с такими дилеммами?И как ты с этим справился?

Заранее спасибо!

Это было полезно?

Решение

Предполагая, что допустимые значения для местоположения и порядка уникальны (то есть, когда они входят, вы можете отличить их, или, если они предоставляют только один, как вы узнаете, является ли это местоположение или заказ?) , тогда вы можете просто взять два параметра и выяснить, какие они есть в контроллере.

Маршрут: {controller} / {action} / {param1} / {param2}

Действие контроллера:

public ActionResult MyAction(string param1, string param2)
{
    string location;
    string order;
    if (!ParseLocation(param1, out location))
    { ParseLocation(param2, out location); }
    // ...
}

Не очень элегантно, но позволяет вам иметь нужные URL-адреса.

Другие советы

Нажмите на свой Ссылка на профиль и просмотрите URL-адреса «Статистика», «Последние», «Ответ» и т. д.

Примеры:

без сортировки по умолчанию используется статистика

Необязательные параметры должны быть параметрами запроса.

У вас всегда будет эта проблема, если у вас есть несколько необязательных параметров. Либо сделайте один или оба из них необязательными (и расположенными в строке запроса раньше, чем необязательный), либо используйте запись параметра строки запроса.

Хорошо, ребята, просто выкладываю решение, с которым я до сих пор играл.

Я настроил свои маршруты, используя ограничения следующим образом:

        routes.MapRoute(
            "VenuesList",                                              
            "venues/list/{category}/{location}/{orderBy}",             
            new { controller = "venues", action = "list", category = "", location = "", orderBy = "" },
            new { location = "central|east|west|south", orderBy = "top-rated|price" }
        );

    routes.MapRoute(
            "VenuesListByLocation",                                              
            "venues/list/{category}/{location}",                           
            new { controller = "venues", action = "list", category = "", location = "" },
            new { location = "central|east|west|south" }
        );

        routes.MapRoute(
            "VenuesListByOrder",                                              
            "venues/list/{category}/{orderBy}",                           
            new { controller = "venues", action = "list", category = "", orderBy = "" },
            new { orderBy = "top-rated|price" }
        );

        routes.MapRoute(
            "VenuesListDefault",                                              
            "venues/list/{category}",                           
            new { controller = "venues", action = "list", category = "" }

        );

        routes.MapRoute(
            "Default",                                              
            "{controller}/{action}/{id}",                           
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        ); 

Идея состоит в том, что если проверка не пройдена, она перейдет к следующему маршруту в списке ... в конечном итоге достигнет значения по умолчанию.

Требуется дополнительное тестирование, но до сих пор хорошо работало ...

Почему бы вам не создать свойство на странице для каждого возможного параметра строки запроса?

Таким образом, вы можете справиться с этим любым способом, используя несколько строк кода ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top