MVC RedirectToAction和XMLHttpRequest发送

时间:2011-07-12 13:39:20

标签: asp.net-mvc xmlhttprequest

我有一个可以包含文件的表单,它会成功显示进度条。我的问题是在MVC控制器中我有:

return RedirectToAction("Complete", new { title = title });

如果我单步执行它会执行Complete方法,但它会返回到JavaScript加载事件并且不会重定向我,除非我在加载事件监听器(uploadComplete)中添加JavaScript重定向:

var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false);
xhr.open("POST", "/Submit-Recipe", true);
xhr.send(fd);

function uploadComplete(evt) { 
//var valueFromController = how do I get a value here?;       
//window.location.replace("http://@ConfigurationManager.AppSettings["website"]/SubmitRecipeComplete/" + valueFromTheController);
}

有没有办法不必添加JavaScript重定向?如果我确实需要JavaScript重定向,当需要成为ActionResult时,如何从控制器传回变量(如果有错误,我需要重新显示页面?)。

我可以通过添加第二页来解决这个问题,在那里我可以知道“valueFromController”,但是2个表单会破坏工作流程。

修改

我做了Praveen所说的但是GetData()对我不起作用所以我用它代替了:

evt.currentTarget.responseText 

确定是否要返回我在xhr.send(fd)之前添加的视图或内容;

xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

然后在控制器中我可以这样做:

if (Request.IsAjaxRequest())
{
    return Content(title);
}     

1 个答案:

答案 0 :(得分:1)

public Class myContoller:controller
{
     public ActionResult MyAction()
     {
     bool isWantToRedirect;

     if(isWantToRedirect)
     {
       return Content('redirect');
     }
     else
     {
          return View(); 
     }
}



function uploadComplete(evt) { 

 var valueFromController = evt.GetData();

  if(valueFromController=="redirect")
  {
     //redirect
  }
  else
  {
     //do not redirect, do something else
   }
}