MVC RedirectToAction 通过 ajax jQuery 在knockoutjs 中调用不起作用 [英] MVC RedirectToAction through ajax jQuery call in knockoutjs is not working

查看:16
本文介绍了MVC RedirectToAction 通过 ajax jQuery 在knockoutjs 中调用不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个 MVC3 Web 应用程序并且我正在使用 Knockoutjs.应用程序中有两个视图.设置新公司和管理帐户.要建立新公司,用户首先输入帐号并单击搜索.如果帐号已经存在,用户可以单击按钮转到 ManageAccount 视图.在 SetUpNewCompanyController 中,我使用 RedirectToAction 方法重定向.但是,当执行 ManageAccount 中的 Index2 操作时,不会显示该视图.如果我输入完整的 URL,就会显示视图.

I am building a MVC3 web application and I am using knockoutjs. There are two views in the application. SetUpNewCompany and ManageAccount. To Set up a new company the user first enters the account number and clicks search. If the account number already exists the user can click on a button to go to the ManageAccount view. In the SetUpNewCompanyController I redirect using the RedirectToAction method. However, when the Index2 action in ManageAccount is executed the view is not displayed. If I type in the complete URL the view is displayed.

SetUpNewCompanyController.cs

SetUpNewCompanyController.cs

[HttpPost]
 public RedirectToRouteResult RedirectToManageAccount(string accountNumber)
 {
        return RedirectToAction("Index2", new RouteValueDictionary(new {controller=
            "ManageAccount", companyId = "7e96b930-a786-44dd-8576-052ce608e38f" }));
 }

当点击按钮时,下面的函数会调用上面的这个

This above is called by the function below when a button is clicked

self.redirectToManageAccount = function () {
        var accountNumber = "7e96b930-a786-44dd-8576-052ce608e38f";
        $.ajax({
            type: "POST",
            url: "/SetUpNewCompany/RedirectToManageAccount",
            data: { accountNumber: accountNumber },
            success: function (data) {
            },
            error: function () {
            }
        });
 }

ManageAccountController.cs

ManageAccountController.cs

public ActionResult Index2(String companyId)
    {
        var viewModel = new Models.Index();

        List<String> compList = new List<String>();
        compList.Add("MyCompany");

        List<String> usersList = new List<String>();
        usersList.Add("User1");

        viewModel.Users = usersList;
        viewModel.Companies = compList;
        viewModel.CompanyId = companyId;
        viewModel.Role = "Role1";

        return View("ManageAccount",viewModel);
    }

生成的网址是

http://localhost:53897/ManageAccount/Index2?companyId=7e96b930-a786-44dd-8576-
052ce608e38f

Firebug 中的控制台窗口显示

The console window in Firebug shows

GET http://localhost:53897/ManageAccount/Index2?companyId=7e96b930-a786-44dd-8576-
052ce608e38f 200 OK and the spinner keeps spinng

另外,如何获取下面的 URL 而不是带有查询字符串的 URL

Also, how do I get the URL below instead of the one with querystring

http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f

推荐答案

由于您使用 AJAX 调用 RedirectToManageAccount 操作方法,因此您有责任自己处理它的响应并作为您的 成功 处理函数为空,您实际上忽略了作为响应到达的任何内容.

Since you use AJAX to call the RedirectToManageAccount action method, you are responsible for handling its response yourself and as your success handler function is empty, you are effectively ignoring whatever arrives as a response.

如果您想从 AJAX 响应处理程序中强制重定向,我建议

If you want to force a redirect from within the AJAX response handler, I suggest

  1. 修改你的操作方法如下

  1. Modifying your action method as follows

[HttpPost]
public ActionResult RedirectToManageAccount(string accountNumber)
{
    var redirectUrl = new UrlHelper(Request.RequestContext).Action("Index2", "ManageAccount", new { companyId = "7e96b930-a786-44dd-8576-052ce608e38f" });
    return Json(new { Url = redirectUrl });
}

  • 以这种方式更新您的 AJAX 调用

  • Updating your AJAX call in this way

    self.redirectToManageAccount = function () {
      var accountNumber = "7e96b930-a786-44dd-8576-052ce608e38f";
      $.ajax({ type: "POST",
               url: "/SetUpNewCompany/RedirectToManageAccount",
               data: { accountNumber: accountNumber },
               dataType: 'json',
               success: function (response) {
                   window.location.href = response.Url;
               },
               error: function () {
               }
      });
    }
    

  • 至于你的第二个问题:

    另外,如何获取下面的 URL 而不是带有查询字符串的 URLhttp://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f

    Also, how do I get the URL below instead of the one with querystring http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f

    您只需在 RegisterRoutes() 函数中为此 URL 定义适当的路由条目:

    You just have to define an appropriate route entry for this URL in your RegisterRoutes() function:

    routes.MapRoute(null,
                    "ManageAccount/Index2/{companyId}",
                    new { controller = "ManageAccount",
                          action = "Index2" }                            
    );
    

    <小时>

    EDIT:由于您的 AJAX 调用仅用于调用导致重定向的操作方法,您可以通过以下方式对其进行简化,前提是您在这一点上(在客户端)知道companyId 已经:


    EDIT: As your AJAX call only serves to call an action method which causes a redirect, you can simplify it in a following way, provided you in this point (on the client side) know the companyId already:

    self.redirectToManageAccount = function () {
        var companyId = "12345";
        window.location.href = '@(Html.ActionUri("Index2", "ManageAccount"))?companyId=' + companyId;
    }
    

    我在哪里使用这种扩展方法

    where I used this extension method

    public static string ActionUri(this HtmlHelper html, string action, string controller)
    {
        return new UrlHelper(html.ViewContext.RequestContext).Action(action, controller);
    }
    

    这篇关于MVC RedirectToAction 通过 ajax jQuery 在knockoutjs 中调用不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆