2011-01-24 48 views
23

在我当前使用asp.net MVC 3(使用剃须刀)的项目中,当我进行Ajax调用时,我必须将JS保留在视图页面上,因为我想使用Url.Action来生成URL。这意味着我不能将js代码拆分为.JS文件,是否有比我目前所做的更好的解决方案。在javascript代码中使用Url.Action的更好的解决方案

+0

西蒙,我最近回答了这个问题,但实际上发现接受的答案是一个更简洁的解决方案。看看这里为你的问题一个很好的简单的解决方案:http://stackoverflow.com/questions/4624626/do-you-write-your-javascript-in-a-asp-net-mvc-view-or-in -a-separate-javascrip/4625478#4625478欢呼声.. – 2011-01-24 12:16:48

回答

17

我倾向于以类似上述方式完成此操作,稍微不同的扭曲,因为我喜欢命名空间我的JavaScript。

JavaScript文件看起来像:

var my = {}; 

my.viewname = 
{ 
    init : function(settings){ 
     // do some work here. settings.someImportantUrl has my json/ajax url eg. 
     alert(settings.someImportantUrl); 
    } 
} 

然后,我的观点将包含这样的内容:

<script language='javascript'> 
    // allocate an object with variables you want to use in the external js file 
    var settings = {someImportantUrl: '<%=Url.Action(...)%>'}; 
    // call an init method for the current view 
    my.viewname.init(settings); 
</script> 
10

您只能在视图中定义url并将所有其他javascript代码保存在.js文件中。

有从视图代码在我MVC.NET 1应用:

<script type="text/javascript" src="<%=Url.Content("~/Scripts/Account/ManageUsers.js")%>"></script> 

<script type="text/javascript" src="<%=Url.Content("~/Scripts/Account/ManageUsersAndGroups.js")%>"></script> 

<script type="text/javascript"> 

    var getUsersUrl = '<%= Url.Action("GetUsers", "Account") %>'; 
    var getUserDetailsURL = '<%= Url.Action("GetUserDetails", "Account") %>'; 

    <%If Not ViewData("readOnly") Then%> 
    var changeRolePermissionsUrl = '<%= Url.Action("ChangeRolePermissions", "Account") %>'; 
    var deleteUserUrl = '<%= Url.Action("DeleteUser", "Account") %>'; 
    var resetPasswordUrl = '<%= Url.Action("ResetPassword", "Account") %>'; 
    var updateUserGroupsUrl = '<%= Url.Action("UpdateUserGroups", "Account") %>'; 
    var updateUserDetailsUrl = '<%= Url.Action("UpdateUserDetails", "Account") %>'; 
    <%End If%> 
</script> 

所以,你甚至可以不必渲染不能由用户因安全原因被调用操作的URL。 (ViewData("readOnly")表示用户只能读取屏幕访问权限)。

而且有大量的代码在js文件的一部分:

function GetUsersList() { 
    ajax.getJSON(getUsersUrl, {}, function(data) { 
     if (data != false) { 
      ShowUsers(data); 
     } 
     else { 
      jAlert('Error during users list retrieving.'); 
     } 
    }); 
} 

getUsersUrl在查看

+0

我正在考虑这些内容,即将所有我的Ajax网址保存在一个共享的ascx中,并保持这一点,我只是想确保我不会错过某些东西否则可能更容易 – Simon 2011-01-24 12:02:21

+0

我没有看到更好的方法。但我可以说我的做法很好。它用于一个大型项目约1个。5年,我们在开发和维护方面没有任何问题。 – Egor4eg 2011-01-24 12:37:18

+0

这是我得到的最佳解决方案。谢谢@ Egor4eg – 2017-02-28 12:51:11

2

你的JavaScript代码定义应该驻留在单独的JavaScript文件。你可以使用全局变量来链接你的视图和JavaScript。例如。查看页面如下所示。

view html ... 
<script type="text/javascript"> 
var pageUrl = @GetURL() 
</script> 

<script type="text/javascript" src="/js/script.js"/> 

script.js文件中使用pageUrl变量等全局变量。

2

我不知道这个安全后果的,但另一种方式来做到这一点将使用@ Url.Action设置html标记的'id',然后您可以创建一个JavaScript点击函数,如下所示:

Vi EW

<div class="someClickable" id='@Url.Action("Action", "Controller")'> 
</div> 

引用的JavaScript文件

$(function() { 
    $('someClickable').click(function() { 
     $.ajax({ 
      url: this.id, 
      success: someJSFunction, 
      dataType: "html" 
     }); 
    }); 
}); 

您存储在该 'DIV' 的 '身份证' 所需的URL结束。只要您只进行只读操作,这似乎是一个合理的解决方案。

相关问题