ASP.NET MVC3 - 从Action动态创建javascript

时间:2012-02-26 22:54:32

标签: javascript asp.net-mvc asp.net-mvc-3 razor

我有一个MVC3应用程序,其中我有javascript函数,必须调用MVC操作来获取数据或重定向页面。

目前,javascript位于cshtml文件中(使用razor),因此我可以利用Url.Action(..)Url.Content(..)函数。

如果我想将这些文件分开,我将丢失文件的服务器端编译,因为.js显然不是由剃刀引擎处理的。

是否可以创建一个cshtml视图并将内容(Reponse.ContentType)作为'application / javascript'返回,还是有另一种方法可以实现所需的结果?

提前致谢

萨姆

2 个答案:

答案 0 :(得分:4)

  

还是有另一种方法可以达到预期的效果吗?

实际上有。设计你的javascript函数,以便他们将这些url作为参数。然后,您所要做的就是在视图中保留初始化调用并传递所需的URL:

<script type="text/javascript">
    myJsInitialize('@Url.Action("Foo")', '@Url.Content("~/bar")');
</script>

或另一种可能性是将这些网址作为您的javascript正在使用的DOM的一部分。例如,假设您有一个链接,并且您希望在单击此链接时发送AJAX请求:

@Html.ActionLink("click me", "someaction", null, new { id = "mylink" })

并在您单独的js文件中,您将使用已包含url的链接的href属性:

$('#mylink').click(function() {
    $('#result').load(this.href);
    return false;
});

但是,如果您需要此函数中的另一个url,该怎么办?让我们假设您需要在下拉选项更改时使用AJAX调用操作。在这种情况下,您可以在下拉列表中使用HTML5 data-*属性:

@Html.DropDownListFor(
    x => x.SelectedItem,
    Model.Items,
    new { 
        id = "myddl",
        data_url = Url.Action("someaction")
    }
)

然后在你单独的javascript文件中:

$('#myddl').change(function() {
    var selectedValue = $(this).val();
    var url = $(this).data('url');
    $.post(url, { value: selectedValue }, function(result) {
        // ...
    });
});

了解我们不再需要让javascript函数依赖于服务器端帮助程序,例如Url.ActionUrl.Content?这允许您将它们放在单独的javascript文件中,而不必担心在IIS虚拟目录中部署它时应用程序将停止工作。

答案 1 :(得分:2)

脚本块的一个鲜为人知的特性是您可以在块中提供src属性和代码。所以,你可以这样做:

<script type="text/javascript" src="@Url.Content("~/Scripts/Myscript.js")">
    var myurl = `@Url.Action("SomeAction", "SomeController")`;
</script>

然后,在您的脚本中,您可以参考myurl。