Подтвердить что ты не робот

Лучшее решение для использования Url.Action в javascript-коде

В моем текущем проекте, используя asp.net MVC 3 (используя бритву), когда я делаю вызовы Ajax, мне нужно сохранить JS на странице просмотра, потому что я хочу использовать Url.Action для создания URL-адреса. Это означает, что я не могу разбить код js на .JS файлы. Есть ли лучшее решение, чем то, что я сейчас делаю.

4b9b3361

Ответ 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". Это кажется разумным решением, если вы выполняете действия только для чтения.