您好我正在学习Ajax + MVC。我认为控制器自动处理ajax感知的Redirect()会很好。经过一番挖掘,我找到了这个link的代码。下面的代码对用户完全透明,用户只需调用Redirect(someUrlString),无需担心普通/ ajax调用之间的区别。使它非常整洁和凉爽。
public abstract class BaseController : System.Web.Mvc.Controller {
//turn into ajax aware redirect
protected override RedirectResult Redirect(string url) {
return new AjaxAwareRedirectResult(url);
}
}
和......
public class AjaxAwareRedirectResult : RedirectResult {
public AjaxAwareRedirectResult(string url) : base(url) { }
public override void ExecuteResult(ControllerContext context) {
if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) {
string desturl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
JavaScriptResult result = new JavaScriptResult() {
Script = "window.location='" + desturl + "';" };
result.ExecuteResult(context);
}
else { base.ExecuteResult(context); }
}
}
然而,它并不完整。挑战是:
RedirectToRouteResult RedirectToAction
( ActionResult 结果)
还没有(特别是T4MVC非常方便)。
由于我还是MVC的新手,我尝试过,但我不够了解自己如何写出来。你们中的任何一位专家可以帮助我吗?所以我可以从你的代码中学到它?非常感谢你。
答案 0 :(得分:7)
这是我在项目中用于Ajax感知重定向的快速简单解决方案..
创建一个AjaxRedirectAttribute类来执行操作。
public class AjaxRedirectAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var result = filterContext.Result as RedirectResult;
if (result != null && filterContext.HttpContext.Request.IsAjaxRequest())
{
string destinationUrl = UrlHelper.GenerateContentUrl(result.Url, filterContext.HttpContext);
filterContext.Result = new JavaScriptResult()
{
Script = "window.location = '" + destinationUrl + "';"
};
}
}
}
如下所示,使用此属性重定向到其他页面或从操作中返回一些结果。
[AjaxRedirect]
public ActionResult MyAction(FormCollection frmcol)
{
// some code here
if (UserId != 0)
{
return Redirect(this.Url.Action("Action", "Controller"));
}
else
{
return Content("Error message here.");
}
}
答案 1 :(得分:0)
这是一个很好的解决方案,可以使用Ajax(Ajax.BeginForm或jquery.ajax)调用的MVC异常处理。
因此,正如您所知,global.asax.cs文件中存在Application_Error。你可以告诉我如何处理ajax调用for" JavaScriptResult"结果
我正在使用" RedirectToRoute"处理它,但在一些代码中它附加了现有标头的html。我的错误控制器没有布局(_Layout = null),但它仍然显示页眉和页脚。
我正在努力进行全新的RedirectToRoute通话。
Response.RedirectToRoute("Default", new {controller = "Error", action = "Error"});
protected void Application_Error(object sender, EventArgs e)
{
RouteValueDictionary routeDataCollection = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (null != routeDataCollection && routeDataCollection.Count()>1)
{
Server.ClearError();
Response.RedirectToRoute("Default", new { controller = "Error", action = "Error"});
}
}
由于
Sagar的