Корректный код Контроллера для 301 Перенаправления

Используйте Testivus. Все, что необходимо знать, тут же:)

5
задан Dan Atkinson 11 September 2011 в 18:40
поделиться

3 ответа

Я повторяю комментарии Леви. Это не задача контроллера. Я обычно использовал этот пользовательский ActionResult для 301. Ниже представлена ​​модифицированная версия с дополнительными параметрами.

Для ASP.NET MVC v2 + используйте RedirectResult .

public class PermanentRedirectResult : ActionResult
{
  public string Url { get; set; }

  public PermanentRedirectResult(string url)
  {
    Url = url;
  }

  public PermanentRedirectResult(RequestContext context, string actionName, string controllerName)
  {
    UrlHelper urlHelper = new UrlHelper(context);
    string url = urlHelper.Action(actionName, controllerName);

    Url = url;
  }

  public PermanentRedirectResult(RequestContext context, string actionName, string controllerName, object values)
  {
    UrlHelper urlHelper = new UrlHelper(context);
    string url = urlHelper.Action(actionName, controllerName, values);

    Url = url;
  }

  public PermanentRedirectResult(RequestContext context, string actionName, string controllerName, RouteValueDictionary values)
  {
    UrlHelper urlHelper = new UrlHelper(context);
    string url = urlHelper.Action(actionName, controllerName, values);

    Url = url;
  }

  public override void ExecuteResult(ControllerContext context)
  {
    if (context == null)
    {
      throw new ArgumentNullException("context");
    }
    context.HttpContext.Response.StatusCode = 301;
    context.HttpContext.Response.RedirectLocation = Url;
    context.HttpContext.Response.End();
  }
}

Использование в действии

//Just passing a url that is already known
return new PermanentRedirectResult(url);

//*or*

//Redirect to a different controller/action
return new PermanentRedirectResult(ControllerContext.RequestContext, "ActionName", "ControllerName");
14
ответ дан 18 December 2019 в 11:58
поделиться

Контроллер не должен отвечать за установку 301 и расположение перенаправления. Эта логика должна быть инкапсулирована в ActionResult, и контроллер должен возвращать экземпляр этого ActionResult. Помните, что метод Response.End () не возвращает (генерирует исключение); следующие за ним строки не будут выполняться.

1
ответ дан 18 December 2019 в 11:58
поделиться
0
ответ дан 18 December 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: