3

我想调用我的操作并让该操作返回直接呈现到视图上的结果部分视图,或者让操作重定向到服务器上的另一个页面。

但是,当我通过 jQuery 执行此操作时,它似乎将重定向的页面加载到我的目标 div 元素中,而不是干净地重定向并有效地重新加载页面/站点。

jQuery 调用:

$.ajax({
     type: "GET",
     url: "Myurl",
     dataType: "html",
     success: function (data) {
         // replace the context of the section with the returned partial view
         $('#upload_section').html(data);
     }
 });

MVC 动作示例

public ActionResult MyAction() 
{
   bool doRedirect = // some code to determine this condition
   if (doRedirect)
   {
      return RedirectToAction("MyAction", "Home");
   }
   else
   {
      // return the partial view to be shown
      return PartialView("_UploadSessionRow");
   }
}

我做这一切都错了吗?有没有更好的实践方法来做到这一点?这样做的需要将出现在其他操作和 jQuery 请求中,所以我正在寻找一种通用方法来解决这个问题。

更新:感谢 Andrews 的回答,我得到了我所追求的东西,按照他的建议对我的 ajax 进行了一些修改。最终的ajax是:

function loadOrRedirect(options) {

    var jData = null;

    try {    
        if (options.data) {
            jData = $.parseJSON(options.data);

            if (jData.RedirectUrl) {
                window.location = jData.RedirectUrl;
            }
        }
    } catch (e) {
        // not json
    }

    if (!jData && options.callback) {
        options.callback(options.data);
    }
};

$.ajax({
     type: "GET",
     url: "Myurl",
     dataType: "html",
     success: function (data) {
         loadOrRedirect(
                       {
                          data: data,
                          callback: function (html) {
                                    replaceRow.replaceWith(html);
                                    alternateRowHighlighting();
                       }
         });
}

});

4

2 回答 2

18

您不能从 AJAX 请求重定向。您将不得不从 JavaScript 进行重定向。我会推荐这样的东西:

public ActionResult MyAction() 
{
   bool doRedirect = // some code to determine this condition
   if (doRedirect)
   {
      return Json(new 
      {
          RedirectUrl = Url.Action("MyAction", "Home")
      });
   }
   else
   {
      // return the partial view to be shown
      return PartialView("_UploadSessionRow");
   }
}

然后在 JavaScript 方面:

$.ajax({
     type: "GET",
     url: "Myurl",
     dataType: "html",
     success: function (data) {
         if (data.RedirectUrl) {
             window.location = data.RedirectUrl;
         } else {
             // replace the context of the section with the returned partial view
             $('#upload_section').html(data);
         }
     }
 });
于 2012-09-07T01:08:13.170 回答
0

您可以使用success回调的第二个或第三个参数来确定要做什么。无论如何,由于您使用的是 ajax,因此您将无法进行正常的重定向。您可能需要通过 javascript 进行二次重定向或将整个页面替换为从RedirectToAction

于 2012-09-07T01:08:07.947 回答