Когда использовать RedirectToAction и где использовать RedirectToRouteResult?
Вопрос
В каком контексте я могу использовать RedirectToAction
и где использовать RedirectToRouteResult
?
У меня есть два метода действий, как показано ниже.
Подход - 1
public class ActionResultTypesController : Controller
{
public ActionResult Content()
{
return new RedirectToRouteResult(new RouteValueDictionary(
new { action = "Fileresult", controller = "ActionResultTypes" }));
}
public ActionResult Fileresult()
{
return View();
}
}
Подход - 2
Я мог бы написать тот же код, что и ниже. Единственное различие заключается в том, что на этот раз я использовал RedirectToAction
вместо RedirectToRouteResult
public class ActionResultTypesController : Controller
{
public ActionResult Content()
{
return RedirectToAction("Fileresult", "ActionResultTypes");
}
public ActionResult Fileresult()
{
return View();
}
}
Оба куска кода имеют общий результирующий
Ответы
Ответ 1
Между ними нет большой разницы при использовании в контроллере, как в вашем примере.
Оба они в конечном итоге достигают той же цели. Однако RedirectToRouteResult() в основном используется в сценарии типа фильтра действий который показан здесь. Он немного менее дружелюбен по отношению к глазам при использовании только в ваших действиях на контроллерах.
Оба могут достичь той же цели. Вопросы, которые вам нужно задать себе в большинстве сценариев, действительно:
- Нужен ли мне постоянный флаг перенаправления при использовании RedirectToRouteResult()?
- Нужно ли писать дополнительный код при использовании RedirectToRouteResult()?
Если ваш ответ отрицательный или я не знаю,
RedirectToAction("Action", "Controller", new { parameter = value });
вероятно, лучший выбор!
EDIT:
Здесь немного света, на котором RedirectToRouteResult
.
Ссылка на некоторые перенаправления MVC.
В этом вы заметите, что RedirectToRouteResult
- это не то, что вы обычно вызываете для возврата в действие. Он используется как тип возврата для нескольких вызовов RedirectToRoute
. Например, есть 2 вызова, которые вы увидите в этой книге. RedirectToRoute
и RedirectToRoutePermanent
.
Оба они возвращают RedirectToRouteResult
, кроме того, RedirectToRoutePermanent
возвращает результат с постоянной переадресацией bool true
. Это возвращает a HTTP 301 status code
.
Надеюсь, это поможет!
Ответ 2
Я новичок в MVC, но обнаружил, что я использую собственный класс Authenticate, и одно из свойств возвращает RedirectToRouteResult. Этот класс не является контроллером (или полученным из него), поэтому RedirectToAction недоступен, и я бы использовал RedirectToRouteResult.
Свойство выглядит следующим образом:
public RedirectToRouteResult NotLoggedInPage
{
get
{
return new RedirectToRouteResult(new RouteValueDictionary(new { action = "LoggedOut", controller = "Login" }));
}
}
Ответ 3
Это почти то же самое, но...
что происходит, когда вы работаете с несколькими пользовательскими маршрутами? это альтернатива, которая поддерживает маршруты
со вторым подходом, который вы работаете с маршрутом по умолчанию, но когда вам нужно использовать определенный маршрут с 3 или 4 параметрами, вы можете использовать первый подход и указанное имя маршрута и со всеми параметрами.
такие варианты, которые вы можете найти в помощниках, например, сайт для новостных бумаг:
ваш проект имеет два маршрута
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"NewsRoute", // Route name
"News/{action}/{year}/{month}/{day}/{news}",
new { controller = "News", action = "show", year = 2013, month = 6, news = "start-new" }
);
маршрут по умолчанию, используемый для содержимого и специальных страниц, и NewsRoute, который он использовал для показа и редактирования новостей
если вам нужно создать какой-то URL-адрес, вы должны сделать это как
@Url.Action("Home","Contact")
@Url.RouteUrl("NewsRoute", new RouteValueDictionary(new {action = "show", year = 2013, month = 6, news = "title news" }));
и перенаправить его таким же образом