MVC RedirectToAction through ajax jQuery call in knockoutjs is not working
ajax, asp.net-mvc-3, knockout.js
Solution
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.
If you want to force a redirect from within the AJAX response handler, I suggest
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 });
}
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 () {
}
});
}
As for your second question:
Also, how do I get the URL below instead of the one with querystring `http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f`
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: 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);
}
Problem
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 ``` [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 ``` 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); } ``` The URL that is generated is ``` http://localhost:53897/ManageAccount/Index2?companyId=7e96b930-a786-44dd-8576- 052ce608e38f ``` 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 ``` Also, how do I get the URL below instead of the one with querystring ``` http://localhost:53897/ManageAccount/Index2/7e96b930-a786-44dd-8576-052ce608e38f ```