在我目前使用asp.net MVC 3(使用razor)的项目中,当我进行Ajax调用时,我必须将JS保留在视图页面上,因为我想使用Url.Action生成URL。这意味着我无法将js代码拆分为.JS文件,是否有比我目前所做的更好的解决方案。
答案 0 :(得分: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>
答案 1 :(得分:10)
您只能在视图中定义网址,并将所有其他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
的位置
答案 2 :(得分: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
变量和其他全局变量。
答案 3 :(得分:2)
我不确定这方面的安全后果,但另一种方法是使用@ Url.Action设置html标记的'id',然后你可以创建一个javascript点击功能,如以下内容:
查看强>
<div class="someClickable" id='@Url.Action("Action", "Controller")'>
</div>
引用的javascript文件
$(function() {
$('someClickable').click(function () {
$.ajax({
url: this.id,
success: someJSFunction,
dataType: "html"
});
});
});
您最终会将所需的网址存储在'div'的'id'中。只要您进行只读操作,这似乎是一个合理的解决方案。