【问题标题】:Redirecting to action from javascript从 javascript 重定向到操作
【发布时间】:2013-12-27 22:16:25
【问题描述】:

我有一个 MVC4 项目,在客户端我需要重定向到特定的操作方法。我已经阅读了以下帖子How to redirect to action from JavaScript method?,并且在下面还有一条关于使用的评论:

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) 来构建我的字符串,也会发生同样的事情。

有什么想法吗?

【问题讨论】:

    标签: javascript asp.net-mvc-4 redirect action


    【解决方案1】:

    在为控制器操作生成 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;
      
    • 在某些 DOM 元素上使用 HTML5 data-* 属性,以某种方式与用户的注销相关联。例如,这可能是一些 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,并考虑任何可能的虚拟目录。这是最重要的规则:从不在 ASP.NET MVC 应用程序中对 url 进行硬编码。

    【讨论】:

    • 哎呀!非常感谢您提供详细的cmets!我不确定我在想什么不使用 HTML 助手。
    【解决方案2】:

    虽然这似乎是随机的,但这确实涉及上述情况,因为所有内容都出现在动态弹出窗口中。有 2 个按钮(注销、继续)和一个图像。我无法让图像正确显示,并且想要使用帮助程序的动态链接。我使用以下代码解决了这个问题:

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

    有人发现这有什么问题吗?所有其他 URL 帮助程序示例总是包含控制器和方法,我需要一个有效的、完整的根值。想法?

    【讨论】:

    • 我们一直在使用 var baseUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2016-02-06
    • 2013-07-10
    • 2018-11-07
    相关资源
    最近更新 更多