#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)?
В прошлом:
- Визуализация переменной JavaScript с результатом
@Url.Action
или@Url.RouteUrl
- Передайте результат
@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 для доступа к переменным на стороне клиента.