В моем текущем проекте, используя asp.net MVC 3 (используя бритву), когда я делаю вызовы Ajax, мне нужно сохранить JS на странице просмотра, потому что я хочу использовать Url.Action для создания URL-адреса. Это означает, что я не могу разбить код js на .JS файлы. Есть ли лучшее решение, чем то, что я сейчас делаю.
Лучшее решение для использования Url.Action в javascript-коде
Ответ 1
Я стараюсь сделать это так же, как и выше, с немного другим твистом, поскольку мне нравится namespacing моего 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>
Ответ 2
Вы можете определить только отображаемые 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
определяется в представлении
Ответ 3
ваш код javascript должен находиться в отдельном файле javascript. вы можете использовать глобальные переменные, чтобы связать ваш просмотр и javascript. Например. страница просмотра выглядит следующим образом.
view html ...
<script type="text/javascript">
var pageUrl = @GetURL()
</script>
<script type="text/javascript" src="/js/script.js"/>
script.js
используется переменная pageUrl
и другие глобальные переменные.
Ответ 4
Я не уверен в безопасности, но другой способ сделать это - использовать @Url.Action для установки "id" разметки html, тогда вы можете создать функцию javascript click, например следующее:
Просмотр
<div class="someClickable" id='@Url.Action("Action", "Controller")'>
</div>
Связанный файл javascript
$(function() {
$('someClickable').click(function () {
$.ajax({
url: this.id,
success: someJSFunction,
dataType: "html"
});
});
});
В итоге вы получите нужный URL-адрес, сохраненный в "id" раздела "div". Это кажется разумным решением, если вы выполняете действия только для чтения.