我使用here中的PermanentRedirectResult
在ASP.NET MVC 1中执行301重定向。自升级到2.0后,不再发送301响应。而是发送仅包含类名的200响应。
设置断点表示永远不会调用ExecuteResult
上的PermanentRedirectResult
方法。显然,框架只是在结果上调用ToString()而不是执行它。
有没有人见过这个?这是2.0中的故意更改,如果是这样,我现在需要做什么来使用自定义ActionResult?
答案 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修复了问题。