2010-07-19 75 views
0

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

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

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

+0

你的方法是什么样的? (包括所有的属性,如果有的话) – Ahmad 2010-07-19 12:06:56

回答

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; 
    } 
    } 
} 
+0

我的问题原来是与项目引用,而不是ActionResult的实际代码,但有一个接受和upvote,因为MakePermanent扩展方法是一个更好的方式来处理301,并测试此我的项目中的代码让我意识到我现有的PermanentRedirectResult有什么问题。 – stevemegson 2010-07-20 12:10:14

0

事实证明,含有PermanentRedirectResult类项目仍引用的ASP.NET MVC 1.0装配,虽然该网站已经更新到2.0引用。该框架测试操作方法的返回值,看它是否是一个ActionResult还是其他什么东西应该被包裹在一个ContentResult这样的...

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

...和(actionReturnValue as ActionResult)为null,因为我PermanentRedirectResult扩展错误的ActionResult,它是1.0程序集中的一个,而不是2.0程序集中的一个。

更新引用使PermanentRedirectResult是2.0 ActionResult修复了这个问题。

+0

感谢您的支持。有同样的问题! – Olaj 2011-09-19 09:25:57