我有一个可以包含文件的表单,它会成功显示进度条。我的问题是在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);
}
答案 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
}
}