从javascript重定向到操作

Ric*_*eMN 6 javascript redirect action asp.net-mvc-4

我有一个MVC4项目,在客户端我需要重定向到一个特定的操作方法.我已阅读以下帖子如何从JavaScript方法重定向到操作?,还有一个关于使用的评论:

window.location.href = "/{controller}/{action}/{params}";
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了,但是我的项目安装在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" + "\"";
Run Code Online (Sandbox Code Playgroud)

如果我使用$(location.hostname)来构建我的字符串,会发生同样的事情.

有什么想法吗?

Dar*_*rov 33

在生成控制器操作的URL时,始终使用url帮助程序.例如,如果重定向的脚本位于视图内,则可以执行以下操作:

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

Url.Action无论您的应用程序是否托管在虚拟目录中,服务器端帮助程序都将确保生成正确的URL.

如果在另一种情况下你的javascript位于一个单独的js文件(这显然是最好的做法),你不能使用服务器端助手,那么你有几种可能性:

  • 使用在视图中计算并由脚本使用的全局javascript变量:

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

    然后在你的脚本里面的某个地方:

    window.location.href = logoutUrl;
    
    Run Code Online (Sandbox Code Playgroud)
  • 在某些DOM元素上使用HTML5 data-*属性,该元素将以某种方式与注销用户相关联.例如,可能是一些div或按钮:

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

    然后在你的脚本里面:

    $('#logout').click(function() {
        window.location.href = $(this).data('url');
    });
    
    Run Code Online (Sandbox Code Playgroud)

    显然这似乎是一个愚蠢和过于简单的例子,因为在这种特殊情况下你只需使用一个Html.ActionLink生成一个LogOut锚而不用担心任何javascript或类似的东西,但希望它能为你提供一些现实世界的例子场景.

请注意,在所有示例中,如何使用url帮助程序为控制器操作生成正确的URL,并考虑任何可能的虚拟目录.这是最重要的规则:永远不要在ASP.NET MVC应用程序中硬编码.