单页应用程序中的 RedirectToAction

RedirectToAction in a single-page application

我有一个相当简单的 single-page application,它使用 AJAX 加载和替换页面内容。该应用程序应允许用户向客户添加 phone 个号码。用户通过单击客户页面上的 Ajax.ActionLink 加载 view 以添加新的 phone 号码后,他可以提交包含要添加的号码的 AJAX 表单,如果value 是一个数字,他应该被重定向回客户页面。这是我卡住的地方,我如何 return 另一个 action 的结果?似乎我不能使用 RedirectToAction 因为它 returns 302 并且浏览器发起了一个 GET 请求,在我的情况下这不是允许的动词,浏览器返回结果 404

所以我有两个 controllersPhoneBookControllerCustomersController。用户加载 Customers/Details view 并单击 Ajax.ActionLink 调用 PhoneBook/Add action,这 action return 是 view使用 AJAX 表单提交给 PhoneBook/Create action.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Phone ph, string Caller)
{
    if (ModelState.IsValid)
    {
        ph.Active = true;
        db.PhoneBook.Add(ph);
        db.SaveChanges();
 /*->*/ return RedirectToAction("Details", "Customers", new { Id = ph.CustomerId }); //what should be used instead?
    }

    return PartialView("Add", ph);
}

这类任务通常是如何完成的?

当您使用 ajax 时,您可以 return 来自您的操作的 URL 并将其重定向到 javascript:

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Phone ph, string Caller)
{
    if (ModelState.IsValid)
    {
        ph.Active = true;
        db.PhoneBook.Add(ph);
        db.SaveChanges();
    return Json(new { success = true, redirecturl = Url.Action("RedirectedAction") });
}

定义 ActionLink 时,指定成功处理程序:

new AjaxOptions
{
     OnSuccess = "onSuccess"
}

JavaScript

function onSuccess(result) {
    if (result.success == true)
    {
        window.location = result.redirecturl;
    }
}