不执行自定义ASP.NET MVC ActionResult

时间:2010-07-19 10:46:11

标签: asp.net-mvc asp.net-mvc-2

我使用here中的PermanentRedirectResult在ASP.NET MVC 1中执行301重定向。自升级到2.0后,不再发送301响应。而是发送仅包含类名的200响应。

设置断点表示永远不会调用ExecuteResult上的PermanentRedirectResult方法。显然,框架只是在结果上调用ToString()而不是执行它。

有没有人见过这个?这是2.0中的故意更改,如果是这样,我现在需要做什么来使用自定义ActionResult?

2 个答案:

答案 0 :(得分:1)

我强烈建议您购买Steve Sanderson's Pro ASP.NET MVC 2 Framework的一些内容。没有更好的资源。

public class HomeController : Controller
{
  public ActionResult Index()
  {
    return RedirectToAction("Other").MakePermanent();
  }

  public ActionResult Other()
  {
    return View();
  }
}

public static class RedirectExtensions
{
  public static PermRedirectToRouteResult MakePermanent(this RedirectToRouteResult redirect)
  {
    return new PermRedirectToRouteResult(redirect);
  }

  public class PermRedirectToRouteResult : ActionResult
  {
    public RedirectToRouteResult Redirect { get; private set; }
    public PermRedirectToRouteResult(RedirectToRouteResult redirect)
    {
      this.Redirect = redirect;
    }
    public override void ExecuteResult(ControllerContext context)
    {
      Redirect.ExecuteResult(context);
      context.HttpContext.Response.StatusCode = 301;
    }
  }
}

答案 1 :(得分:0)

事实证明,包含PermanentRedirectResult类的项目仍然引用了ASP.NET MVC 1.0程序集,尽管该网站已更新为引用2.0。框架测试action方法的返回值,看看它是ActionResult还是其他应该包含在ContentResult中的其他东西......

return ((actionReturnValue as ActionResult) ??
  new ContentResult {
    Content = Convert.ToString(actionReturnValue, CultureInfo.InvariantCulture)
  });

...而(actionReturnValue as ActionResult)为空,因为我的PermanentRedirectResult扩展了错误的ActionResult,即1.0程序集中的那个而不是2.0程序集中的那个。

更新引用,以便PermanentRedirectResult是2.0 ActionResult修复了问题。