2

我正在使用 MVC 4。

在我看来,我可以使用 @Url.Action 简单地获取操作的 url

现在我想用所有视图的javascript制作一个javascript文件,而不是把它全部写在视图中,问题是我不能再使用剃须刀的东西了。

所以我的问题是如何从 javascript 分隔文件中获取操作的 url?

4

4 回答 4

2

您需要在视图中定义一个 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>
}
于 2012-12-19T08:47:37.357 回答
0

我之前这样做的一种方法是创建提供 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 控制器操作和视图,因此您可以在它们上设置缓存选项,就像使用任何其他视图一样。

于 2012-12-19T09:28:51.090 回答
0

嗯...我认为您可以定义一个特殊的路线,例如“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>

应该管用。

于 2012-12-19T09:30:01.173 回答
0

如果您想要根路径,请在布局上使用变量并在 JavaScript 文件中使用该变量,例如

// In layout view
<script>
  var rootPath = @Url.Content("~/")
</script>

用户rootPath应用程序 JavaScript 文件中的任何位置

如果您想获得带有动作的控制器的完整路径,那么

// View
<script>
  var url = @Url.Content("ActionName", "ControllerName")
</script>

在你的 JavaScript 文件中使用 url。

于 2015-02-27T19:07:16.450 回答