Перенаправление к действию из javascript

У меня есть проект MVC4, и на стороне клиента мне нужно перенаправить на определенный метод действия. Я прочитал следующий пост Как перенаправить на действие из метода JavaScript?, а ниже есть комментарий об использовании:

window.location.href = "/{controller}/{action}/{params}";

и я уже пробовал это, но это не работает, где мой проект установлен в IIS.

Мой проект опубликован: http://localhost/SomeName.SomeOtherName/

и мне нужно добраться до: http://localhost/SomeName.SomeOtherName/Home/Logout

Когда я использую '/Controller/Action', как было рекомендовано в предыдущем посте, я попадаю сюда: localhost/Home/Logout, и это неправильно.

Я попытался сохранить опубликованное местоположение (такое же, как строка публикации выше) в файле web.config и построить строку (объединить: местоположение публикации + '/Home/logout'), но это тоже не сработало. Ниже приведен stmt, который я использую для этого. Странно то, что это просто объединяет URL-адрес текущей страницы с моим построенным URL-адресом. Мало того, что это недействительно, но я также получаю одну из тех ошибок «потенциально опасный request.path...».

 window.location.href = "\"" + url + "/Home/logout" + "\"";

То же самое произойдет, если я использую $(location.hostname) для создания своей строки.

Какие-нибудь мысли?


person RichieMN    schedule 27.12.2013    source источник


Ответы (2)


Всегда используйте помощники по URL-адресам при создании URL-адресов для действия контроллера. Например, если ваш скрипт, который перенаправляет, находится внутри представления, вы можете сделать это:

<script type="text/javascript">
    window.location.href = '@Url.Action("LogOut", "Home")';
</script>

Помощник на стороне сервера Url.Action обеспечит создание правильного URL-адреса независимо от того, размещено ли ваше приложение в виртуальном каталоге или нет.

Если в другом случае ваш javascript находится в отдельном файле js (что, очевидно, является лучшей практикой), где вы не можете использовать помощники на стороне сервера, у вас есть несколько возможностей:

  • Используйте глобальную переменную javascript, которая рассчитывается внутри представления и используется вашим скриптом:

    <script type="text/javascript">
        var logoutUrl = '@Url.Action("LogOut", "Home")';
    </script>
    

    а затем где-то внутри вашего скрипта:

    window.location.href = logoutUrl;
    
  • Используйте атрибут HTML5 data-* для некоторого элемента DOM, который каким-то образом будет связан с выходом из системы пользователя. Например, это может быть какой-нибудь div или кнопка:

    <div id="logout" data-url="@Url.Action("LogOut", "Home")">Log out</div>
    

    а затем внутри вашего скрипта:

    $('#logout').click(function() {
        window.location.href = $(this).data('url');
    });
    

    Очевидно, это кажется глупым и упрощенным примером, потому что в этом конкретном случае вы просто использовали бы Html.ActionLink для создания привязки LogOut, даже не беспокоясь о каком-либо javascript или подобных вещах, но, надеюсь, это даст вам какой-то пример для вашего реального мировой сценарий.

Обратите внимание, как во всех примерах вспомогательный URL-адрес используется для создания правильного URL-адреса для действия контроллера и учитывает любые возможные виртуальные каталоги. Это самое важное правило: никогда жестко не указывать URL-адрес в приложении ASP.NET MVC.

person Darin Dimitrov    schedule 27.12.2013
comment
Аррррг! Большое спасибо за подробные комментарии! Я не уверен, о чем я думал, чтобы не использовать помощники HTML. - person RichieMN; 28.12.2013

Хотя это может показаться случайным, это действительно связано с описанной выше ситуацией, потому что все появлялось в динамическом всплывающем окне. Есть 2 кнопки (выйти, продолжить) и изображение. У меня были проблемы с правильным отображением изображения, и мне нужна была динамическая ссылка с использованием помощников. Я решил проблему, используя следующий код:

  var siteRoot = "@(Request.Url.Scheme)://@(Request.Url.Host)@(Url.Content("~"))"; 

Кто-нибудь видит в этом что-то плохое? Все остальные примеры вспомогательных URL-адресов всегда включали контроллер и метод, и мне требовалось действительное полное корневое значение. Мысли?

person RichieMN    schedule 30.12.2013
comment
Мы использовали var baseUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content(~); - person Adrian Halid; 20.01.2015