Этот способ полностью использует MVC Routing, так что вы можете в полной мере использовать преимущества инфраструктуры 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 нелегко, и его сложно протестировать. Типы тестирования можно добавить в слой где-нибудь здесь, чтобы облегчить тестирование.