2011-07-12 53 views
3

我有一个表单,可以包含文件,并显示成功进度条。我的问题是,在MVC控制器我有:MVC RedirectToAction和XMLHttpRequest发送

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

这正好和我是否步,但随后又回到了JavaScript load事件,除非我添加了一个JavaScript重定向不重定向我执行完整的方法在负载事件侦听器(uploadComplete):

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个窗体有点打破了工作流程。

编辑

我做了什么,普利文表示,但的GetData()并没有为我工作,所以我用这个来代替:

evt.currentTarget.responseText 

要确定是否回到我加入这个视图或内容就在xhr.send(fd)之前;

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

在控制器我可以然后执行:

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

RedirectToAction仅用于由控制器,它不重定向返回到Web浏览器,即,HTTP 302或HTTP 301 –

回答

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 
    } 
}