Пользовательский ASP.NET MVC ActionResult не выполняется - PullRequest
0 голосов
/ 19 июля 2010

Я использовал PermanentRedirectResult из здесь для выполнения перенаправлений 301 в ASP.NET MVC 1. После обновления до 2.0 ответ 301 больше не отправляется. Вместо этого отправляется ответ 200, содержащий только имя класса.

Установка точки останова указывает, что метод ExecuteResult для PermanentRedirectResult никогда не вызывается. Очевидно, каркас просто вызывает ToString () для результата, а не выполняет его.

Кто-нибудь еще видел это? Это преднамеренное изменение в 2.0, и если да, что мне теперь нужно сделать, чтобы использовать пользовательский ActionResult?

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Немного переработано с 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 голосов
/ 20 июля 2010

Оказывается, что проект, содержащий класс 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) равно нулю, потому что мой PermanentRedirectResult расширяет неправильный ActionResult, тот, что в сборке 1.0, а не в сборке 2.0.

Обновление ссылки таким образом, чтобы PermanentRedirectResult был 2.0 ActionResult, устранил проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...