我正在使用 MVC 4。
在我看来,我可以使用 @Url.Action 简单地获取操作的 url
现在我想用所有视图的javascript制作一个javascript文件,而不是把它全部写在视图中,问题是我不能再使用剃须刀的东西了。
所以我的问题是如何从 javascript 分隔文件中获取操作的 url?
我正在使用 MVC 4。
在我看来,我可以使用 @Url.Action 简单地获取操作的 url
现在我想用所有视图的javascript制作一个javascript文件,而不是把它全部写在视图中,问题是我不能再使用剃须刀的东西了。
所以我的问题是如何从 javascript 分隔文件中获取操作的 url?
您需要在视图中定义一个 JavaScript 变量,然后您可以在脚本中使用该变量。显然,这必须首先声明。
我在我的布局页面上使用了一个助手,它包含所有这些变量和一个我想要特定于页面的部分。请注意,这些将出现在 body 标记之前的任何其他脚本引用之前。
@Scripts.Variables()
@RenderSection("ScriptVariables", false)
Scripts.Variables
是这样的
@helper Variables()
{
<script language="javascript" type="text/javascript">
var ActionGetallAdmin = '@Url.Action("GetAll", "Admin")';
var ActionAccountLogin = '@Url.Action("Login", "Account")';
</script>
}
我之前这样做的一种方法是创建提供 JS 文件(实际上是 CSS 文件)的视图,而不是 HTML 文件。这利用了在 MVC 范例中视图不一定总是 HTML 文件的事实。
你可以通过为它创建一个控制器来做到这一点:
public class AssetController : Controller {
protected void SetMIME(string mimeType) {
// implementation largely removed
this.Response.Headers["Content-Type"] = mimeType;
this.Response.ContentType = mimeType;
}
// this will render a view as a Javascript file
public void ActionResult MyJavascript() {
this.SetMIME("text/javascript");
return View();
}
}
完成此操作后,您可以创建一个视图(使用通常在 ASP.NET MVC 中执行的方式),然后将其编写为 Javascript。请记住不要使用布局,因为您显然不希望这样。
MVC 中视图必须提供的所有内容都可供您使用,因此请随意使用模型等。
@model IList<Entity>
@{
Layout = null;
}
(function ($) {
// javascript!
@foreach(var entity in Model) {
$('#@entity.Id').on('click', function () {
console.log('@entity.Name');
});
}
})(jQuery);
然后,您可以在其他视图中使用老式 Razor 将其连接起来。
<script src="@Url.Action("MyJavascript","Asset")"></script>
这将推出类似的东西
<script src="http://your.domain/asset/myjavascript"></script>
奇迹般有效。当然,视图是动态创建的,所以如果你对此很挑剔,请小心。但是,由于它们是MVC 控制器操作和视图,因此您可以在它们上设置缓存选项,就像使用任何其他视图一样。
嗯...我认为您可以定义一个特殊的路线,例如“actionsjs”,它指向一个动作。
routes.MapRoute(name: "actionsJs",
url: "actionsjs",
defaults: new { controller = "Home", action = "GetActions" });
在您必须将内容设置为正确类型的操作中:
Response.ContentType = "text/javascript";
然后,您将返回一个特定的视图,其中包含带有一些 Razor 的 javascript 代码。
@{
Layout = "";
}
$(function() {
var a = @(1 + 2);
});
此时,您将能够将此“脚本文件”添加到您的站点:
<script type="text/javascript" scr="@Url.Action("GetActions", "Home")"></script>
应该管用。
如果您想要根路径,请在布局上使用变量并在 JavaScript 文件中使用该变量,例如
// In layout view
<script>
var rootPath = @Url.Content("~/")
</script>
用户rootPath
应用程序 JavaScript 文件中的任何位置
如果您想获得带有动作的控制器的完整路径,那么
// View
<script>
var url = @Url.Content("ActionName", "ControllerName")
</script>
在你的 JavaScript 文件中使用 url。