我有一个搜索视图,它使用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();
}
}
答案 0 :(得分:2)
这个问题有点陈旧,但我想我会提供我的意见。 我有一个类似的情况,我必须发布一个帖子,并在页面上填充更新内容的一些HTML,或将用户重定向到一个新的位置。 可能有更好的方法来实现这一点,这就是我所做的。 如果您使用jQuery来执行帖子,那么查看响应的内容类型就足够聪明了;返回视图就像现在一样,在成功函数中填充内容。如果您希望重定向用户
string javascript = "window.location.href='{0}';";
return JavaScript(string.Format(javascript, returnUrl));
mvc框架会将javascript mime类型附加到响应中,jQuery会选择它并执行javascript,并重定向用户。 唯一的问题是javascript将填充到您的success方法中的html内容中。为了克服这个问题,请查询html的内容类型,simmilar为here
答案 1 :(得分:0)
我建议你把它分成两个电话。在第一个AJAX调用中检查它是ViewResponse还是DialogResponse。如果ViewResponse进行另一次AJAX调用以获取实际结果对象,则进行非AJAX服务器调用以重定向到新视图。