Ответ 1
Этот путь полностью использует MVC-маршрутизацию, чтобы вы могли полностью использовать преимущества MVC-инфраструктуры. Вдохновленный ответом штузма.
Здесь у меня есть действие в ApplicationController
для динамического javascript для этого URL-адреса:
/application/js
Я включаю в себя статические файлы здесь, потому что я хочу загрузить только один файл главного javascript. Вы можете просто вернуть динамический материал, если хотите:
/// <summary>
/// Renders out javascript
/// </summary>
/// <returns></returns>
[OutputCache(CacheProfile = "Script")]
[ActionName("js")]
public ContentResult RenderJavascript()
{
StringBuilder js = new StringBuilder();
// load all my static javascript files
js.AppendLine(IO.File.ReadAllText(Request.MapPath("~/Scripts/rr/cart.js")));
js.AppendLine(";");
// dynamic javascript for lookup tables
js.AppendLine(GetLookupTables());
js.AppendLine(";");
return new ContentResult()
{
Content = js.ToString(),
ContentType = "application/x-javascript"
};
}
Это вспомогательная функция, которая создает нашу таблицу поиска. Просто добавьте строку для каждого RouteUrl, который вы хотите использовать.
[NonAction]
private string GetLookupTables()
{
StringBuilder js = new StringBuilder();
// list of keys that correspond to route URLS
var urls = new[] {
new { key = "updateCart", url = Url.RouteUrl("cart-route", new { action = "updatecart" }) },
new { key = "removeItem", url = Url.RouteUrl("cart-route", new { action = "removeitem" }) }
};
// lookup table function
js.AppendLine("// URL Lookuptable");
js.AppendLine("$.url=function(url) {");
js.AppendLine("var lookupTable = " + new JavaScriptSerializer().Serialize(urls.ToDictionary(x=>x.key, x=>x.url)) + ";");
js.AppendLine("return lookupTable[url];");
js.AppendLine("}");
return js.ToString();
}
Это генерирует следующий динамический javascript, который в основном представляет собой таблицу поиска от произвольного ключа к URL-адресу, который мне нужен для моего метода действий:
// URL Lookuptable
$.url=function(url) {
var lookupTable = {"updateCart":"/rrmvc/store/cart/updatecart","removeItem":"/rrmvc/store/cart/removeitem"};
return lookupTable[url];
}
В cart.js у меня может быть такая функция. Обратите внимание, что параметр url берется из таблицы поиска:
var RRStore = {};
RRStore.updateCart = function(sku, qty) {
$.ajax({
type: "POST",
url: $.url("updateCart"),
data: "sku=" + sku + "&qty=" + qty,
dataType: "json"
// beforeSend: function (){},
// success: function (){},
// error: function (){},
// complete: function (){},
});
return false;
};
Я могу вызвать его из любого места:
RRStore.updateCart(1001, 5);
Казалось, это единственный способ, с помощью которого я мог бы использовать маршрутизацию в чистом виде. Динамическое создание URL-адресов в javascript нехорошо и сложно проверить. Типы тестирования могут добавлять в слой где-то здесь, чтобы легко облегчить тестирование.