ASP.NET MVC - сопоставление нескольких параметров строки запроса с красивым URL - PullRequest
7 голосов
/ 06 января 2009

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

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

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 06 января 2009

Перейдите по ссылке в профиле и посмотрите URL-адреса статистики, недавних ответов и т. Д.

Примеры:

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

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

2 голосов
/ 07 января 2009

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

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

        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
        ); 

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

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

2 голосов
/ 06 января 2009

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

Маршрут: {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-адреса, которые вы хотите.

2 голосов
/ 06 января 2009

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

0 голосов
/ 06 января 2009

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

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

...