这种方式充分利用了 MVC 路由,因此您可以充分利用 MVC 框架。受到 stusmith 回答的启发。
在这里,我ApplicationController
对此 URL 有一个动态 javascript 操作:
/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);
这似乎是我能想到的唯一方法,它可以让我以干净的方式使用路由。在 javascript 中动态创建 URL 很麻烦,而且很难测试。测试类型可以在这里的某个地方添加一个层,以方便测试。