2010-07-19 6 views
0

J'ai utilisé le PermanentRedirectResult de here pour effectuer des redirections 301 dans ASP.NET MVC 1. Depuis la mise à niveau vers la version 2.0, la réponse 301 n'est plus envoyée. Au lieu de cela, une réponse 200 contenant uniquement le nom de la classe est envoyée.Personnalisé ASP.NET MVC ActionResult n'est pas exécuté

La définition d'un point d'arrêt indique que la méthode ExecuteResult sur PermanentRedirectResult n'est jamais appelée. Apparemment, le framework appelle simplement ToString() sur le résultat au lieu de l'exécuter.

Est-ce que quelqu'un d'autre a déjà vu ça? Est-ce un changement délibéré dans la version 2.0, et si oui, que dois-je faire maintenant pour utiliser un ActionResult personnalisé?

+0

à quoi ressemble votre méthode? (Incl tous les attributs, le cas échéant) – Ahmad

Répondre

1

Retravaillé un peu de Steve Sanderson's Pro ASP.NET MVC 2 Framework que je vous recommande fortement d'acheter. Il n'y a pas de meilleure ressource.

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

Mon problème se sont avérés être des références de projet plutôt que le code réel du ActionResult, mais ont un accept et un upvote parce que la méthode d'extension MakePermanent est une plus belle façon de gérer 301s et tester cette code dans mon projet m'a fait réaliser ce qui n'allait pas avec mon PermanentRedirectResult existant. – stevemegson

0

Il se trouve que le projet contenant la classe PermanentRedirectResult encore référencé l'ensemble ASP.NET MVC 1.0, bien que le site Web a été mis à jour la référence 2.0. Le cadre teste la valeur de retour de la méthode d'action pour voir si elle est un ActionResult ou quelque chose d'autre qui devrait être enveloppé dans un ContentResult comme ça ...

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

... et (actionReturnValue as ActionResult) est nul parce que mon PermanentRedirectResult étend la mauvais ActionResult, celui de l'assemblage 1.0 plutôt que celui de l'assemblage 2.0.

Mise à jour de la référence de sorte que PermanentRedirectResult est un 2,0 ActionResult résolu le problème.

+0

Merci pour ça. Avait le même problème! – Olaj

Questions connexes