Обработка ASP.NET Маршрутизация MVC во внешнем JavaScript

#javascript #asp.net-mvc #asp.net-mvc-3 #razor #asp.net-mvc-routing

#javascript #asp.net-mvc #asp.net-mvc-3 #razor #asp.net-mvc-routing

Вопрос:

Каков наилучший способ избежать жесткого кодирования URL-адресов в JavaScript (в основном используется при выполнении вызовов AJAX)?

В прошлом:

  1. Визуализация переменной JavaScript с результатом @Url.Action или @Url.RouteUrl
  2. Передайте результат @Url.Action или @Url.RouteUrl в JavaScript в init / ctor.

Есть ли лучший способ?

Было бы хорошо сделать что-то вроде этого:

 var url = $.routes("actionName", "controllerName") // or "routeName" for named routes
$.post(url, { id = 1 }, function() { //.. });
 

Что, конечно, на самом деле невозможно (JavaScript не имеет прямого доступа к viewContext и, следовательно, не имеет доступа к таблицам маршрутов).

Но мне интересно, есть ли способ, которым я могу настроить свою собственную «таблицу маршрутов» для JavaScript, используя только те, которые, как я знаю, понадобятся? (например, я настроил его в представлении)

Как люди справляются с этим?

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

1. создать объект javascript routeFactory? создайте объект, в который вы указываете свои URL-адреса, а затем выполните что-то вроде «routeFactory. GetRoute(‘Default’);» или «routeFactory. GetRoute(‘Home’, ‘About’); » что-то вроде этого?

Ответ №1:

несмотря на внедрение javascript в представления, я предпочитаю — пусть HTML выполняет свою работу, а javascript выполняет свою. Ниже приведен шаблон.

Для ссылок

 /*A cssclass=ajaxlink is added to all those links which we want to ajaxify*/

//html in view
<a class='ajaxlink' href='@Url.Action("Action","Controller")'>I am An Ajax Link</a>

//generated clean html
<a class='ajaxlink' href='/controller/action'>I am An Ajax Link</a>


//Js


jQuery('.ajaxlink').live('click',function(e){
    e.preventDefault();    /*Prevent default behavior of links*/
    var url= $(e.target).attr('href');
   /*
          Now u have url, do post or get: 
          then append received data in some DOM element.
   */
});
 

// Контроллер

 public ActionResult()
{
       if(Request.IsAjax())
       {    
            /*Return partial content*/
            return View(); 
       }
       else
       {
             return View("SomeOther_View.cshtml");

             /*
                At this point you may reject this request or return full view
                whatever you feel is okie.
             */
       }
}
 

Таким образом, можно обрабатывать оба типа пользователей с включенным и отключенным javascript.

То же самое можно сделать для форм.

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

1. Да, я тоже делал это раньше. Но что, если у вас есть кнопка? Вы не можете сохранить URL-адрес в href, поэтому в конечном итоге вам придется использовать атрибут данных HTML5 (например, хранилище DOM).

2. добавление href к кнопке не нарушит ваш html если вы добавите class= ‘ajaxify’ к кнопке, она начнет вести себя как ссылка (если выше js есть). Это зависит от вашего личного выбора. В прошлом я пытался вводить маршруты как Javascript, о чем позже узнал, поскольку он стал неуправляемым.

Ответ №2:

Внедрение механизма маршрутизации Javascript не будет слишком сложным. Во-первых, сериализуйте маршруты с C # на Javascript. Во-вторых, воссоздайте Url.Action метод.

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

Ответ №3:

Это легче сказать, чем достичь на практике, но ваш сайт должен быть полностью функциональным с отключенным JavaScript. Когда это будет достигнуто, вы сможете добавить поддержку AJAX на свой веб-сайт и повторно использовать существующие атрибуты HREF в тегах привязки или атрибуты действий в тегах формы. Веб-сайт будет проще поддерживать, поскольку вам не нужно будет обновлять ссылки в ваших файлах JavaScript.

Ответ №4:

Я решил реализовать свой собственный UrlFactory, используя ASP.NET помощники напрямую (Html / Url) в моем коде, теперь у меня нет с собой src, я опубликую их завтра.

Плюсы в этом: я могу легко отслеживать каждый URL-адрес и выполнять некоторые перезаписи централизованно.

Пример использования:

 @{
  string myAjaxUrl = UrlFactory.GetUrl (ActionName, ControllerName, new { query-params });
}
 

Затем используя их в javascript с

 var jsUrl = '@myAjaxUrl';
 

После того, как вы определили свою собственную фабрику, вы можете перехватывать «важные» URL-адреса (например. для перезаписи), и оставьте общие для реализации помощника Url.

Однако для того, чтобы иметь эту полностью клиентскую часть, есть дополнительный шаг рендеринга контекста маршрутизации Js для доступа к переменным на стороне клиента.

РЕДАКТИРОВАТЬ: как и было обещано, мой очень простой конструктор классов Url:

 public static class UrlFactory
{
    public static string GetUrl(string Action, string Controller, object RouteValues)
    {
        UrlHelper Url = new UrlHelper(HttpContext.Current.Request.RequestContext);
        return Url.Action(Action, Controller, RouteValues);
    }

    // Common URLS for Denied et similars.
    public static string GetDeniedUrl(PEDUtenti Utente, object RouteValues)
    {
        return GetUrl(Utente, "Denied", "Errors", RouteValues);
    }
    public static string GetDeniedUrl(object RouteValues)
    {
        return GetUrl("Denied", "Errors", RouteValues);
    }
}
 

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

1. Но это не работает с внешними файлами Javascript (нет блока сценария в представлении), не так ли?

2. функция javascript может иметь параметры, я обычно передаю URL-адреса как параметры. Как указано: однако для того, чтобы иметь эту полностью клиентскую часть, существует дополнительный шаг рендеринга контекста маршрутизации Js для доступа к переменным на стороне клиента.