Внедряем обход Google с помощью hashbang / Ajax с ASP.NET MVC?

#asp.net-mvc #ajax #search #routing

#asp.net-mvc #ajax #Поиск #маршруты

Вопрос:

Каковы наилучшие практики для реализации шаблона обхода hashbang / Ajax от Google с ASP.NET MVC?

http://code.google.com/web/ajaxcrawling/docs/getting-started.html:

сканер изменит каждый URL-адрес AJAX, такой как

 www.example.com/ajax.html#!key=value
  

чтобы временно стать

 www.example.com/ajax.html?_escaped_fragment_=key=value
  

ASP.NET Структура маршрутизации в Google не позволяет указывать параметры строки запроса, но, конечно, вы всегда можете создать метод action, который принимает _escaped_fragment_ в качестве параметра (или даже просто искать параметр _escaped_fragment_ в заголовке запроса).

Однако это немного громоздко. Есть ли способ лучше?

Обновить:

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

 public virtual ActionResult Index(int id, string _escaped_fragment_)
{
    //Handle Google Ajax Crawler
    if (_escaped_fragment_ != null)
    {
        string[] fragments = _escaped_fragment_.Split(new char[]{'/'}, StringSplitOptions.RemoveEmptyEntries);
        if (fragments.Length > 0)
        {
            //parse fragments
            //return static content
        }
    }
    //normal action operation
    return View();
}
  

Комментарии:

1. Возможно, вы захотите поместить это в метод OnActionExecuting контроллеров, а не в действие. Таким образом, вы можете перенаправить на любое действие, которое считаете наилучшим.

Ответ №1:

Вы пишете use a custom model binder, который будет принимать _escaped_fragment_ параметр строки запроса и возвращать некоторую строго типизированную модель:

 public ActionResult Index(MyModel model)
{
    // Directly use model.Id, model.Key1, model.Key2, ...
    return View();
}