我有一个MVC3应用程序,其中我有javascript函数,必须调用MVC操作来获取数据或重定向页面。
目前,javascript位于cshtml文件中(使用razor),因此我可以利用Url.Action(..)
和Url.Content(..)
函数。
如果我想将这些文件分开,我将丢失文件的服务器端编译,因为.js显然不是由剃刀引擎处理的。
是否可以创建一个cshtml视图并将内容(Reponse.ContentType)作为'application / javascript'返回,还是有另一种方法可以实现所需的结果?
提前致谢
萨姆
答案 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.Action
或Url.Content
?这允许您将它们放在单独的javascript文件中,而不必担心在IIS虚拟目录中部署它时应用程序将停止工作。
答案 1 :(得分:2)
脚本块的一个鲜为人知的特性是您可以在块中提供src属性和代码。所以,你可以这样做:
<script type="text/javascript" src="@Url.Content("~/Scripts/Myscript.js")">
var myurl = `@Url.Action("SomeAction", "SomeController")`;
</script>
然后,在您的脚本中,您可以参考myurl。