我有一个搜索视图,它使用AJAX向服务器发送请求。根据存储库返回的响应对象,应该在搜索视图(发出请求的视图)上显示一个对话框(使用Json对象填充数据),或者将用户重定向到结果视图(填充作为视图模型传递的响应中的数据)。
现在,我已经被告知(和经验),当一个帖子是使用AJAX制作的时候,不能重定向。那么,如果响应是从存储库获得的,是否有某种方法可以重定向到另一个视图并传递视图模型,如果应该显示对话结果,则只需要回发Json对象。
我的控制器操作由搜索视图发布,目前看起来像这样:
[HttpPost]
public ActionResult SomeAction(SearchRequest reqData)
{
ResponseBase response = worker.PerformSearch(reqData);
if (response is ViewResponse)
{
//Redirect to "AnotherView" and pass response as the view model.
return View("AnotherView", response as ViewResponse);
}
else if (response is DialogResponse)
{
//Return the Json object.
return Json(new { type = "dialogresponse", data = response });
}
else
{
//To do: Put error handling code here.
throw new NotImplementedException();
}
}
发布于 2011-05-23 22:39:40
这个问题有点老了,但我想我会提供我的意见。我遇到过类似的情况,我必须发布一篇文章,然后用更新内容填充页面上的一些html,或者将用户重定向到一个新的位置。可能有更好的方法来完成这一点,然而,这就是我所做的。如果您使用jQuery执行post,那么查看响应的内容类型就足够聪明了;要返回一个视图,只需像现在这样做,并在success函数中填充内容。如果您希望重定向用户
string javascript = "window.location.href='{0}';";
return JavaScript(string.Format(javascript, returnUrl));
mvc框架会将javascript mime类型附加到响应中,jQuery将提取该类型并执行javascript,然后重定向用户。唯一需要注意的是,在您的成功方法中,javascript将被填充到html内容中。为了克服这个问题,可以询问html的内容类型,类似于here。
发布于 2011-04-11 09:34:07
我建议你把它分成两个电话。在第一个AJAX调用中,检查它是ViewResponse还是DialogResponse。如果ViewResponse进行另一个AJAX调用以获取实际的结果对象,则进行非AJAX服务器调用以重定向到新视图。
https://stackoverflow.com/questions/5619206
复制