如何 ASP.NET Core 中實現重定向
ASP.NET Core 是一個跨平臺,開源的,輕量級的,模組化的,用於構建高效能的 web 開發框架, ASP.NET Core MVC 內建了多種方式將一個 request 請求跳轉到指定的url,這篇文章我們就來討論如何去實現。
理解 RedirectActionResult
ASP.NET Core MVC 中內建了幾種 Redirect,比如說:RedirectResult, RedirectToActionResult, RedirectToRouteResult 和 LocalRedirectResult,這些類都繼承於 ActionResult 並可給前端返回 Http 302,Http 301,Http 307 和 Http 308 這些狀態碼。
接下來的文章中我們就來看看如何使用這些類。
使用 RedirectResult
可以使用下面任何一個方法來返回 RedirectResult。
Redirect 返回 Http 狀態碼為 302
RedirectPermanent 返回 Http 狀態碼為 301
RedirectPermanentPreserveMethod 返回 Http 狀態碼為 308
RedirectPreserveMethod 返回 Http 狀態碼為 307
具體狀態碼代表什麼意思,大家可查專業資料,下面的程式碼展示瞭如何使用這些方法。
Redirect("/Home/Index"); RedirectPermanent("/Home/Index"); RedirectPermanentPreserveMethod("/Home/Index"); RedirectPreserveMethod("/Home/Index");
如果你被這些方法搞蒙圈了,可以直接使用 RedirectResult ,然後通過 permanent
和 preserveMethod
兩個引數去調節返回什麼樣的 Http 狀態碼即可, 程式碼如下所示:
public RedirectResult Index()
{
return new RedirectResult(url: "/Home/Index", permanent: true, preserveMethod: true);
}
值得注意的是,Redirect 方法也可以將請求導向一個指定的url地址上,比如下面這樣:
public RedirectResult Index() { return Redirect("https://google.com"); }
接下來簡單瞭解一下繼承關係: HomeController 繼承了 Controller ,後者又繼承了 ControllerBase 並實現了 IActionFilter, IFilterMetadata, IAsyncActionFilter, 和 IDisposable 介面,如下程式碼所示:
public class HomeController : Controller
{
}
public abstract class Controller : ControllerBase, IActionFilter, IFilterMetadata, IAsyncActionFilter, IDisposable
{
}
使用 RedirectToActionResult
這個 ActionResult
用於將請求轉向到指定的 Controller.Action
,如果沒有指定 Controller 的話,自然就會跳轉到當前 Controller 下的 Action,可使用下面羅列的方法將請求跳轉到指定的 Action。
RedirectToAction 返回 Http 狀態碼為 302
RedirectToActionPermanent 返回 Http 狀態碼為 301
RedirectToActionPermanentPreserveMethod 返回 Http 狀態碼為 308
RedirectToActionPreserveMethod 返回 Http 狀態碼為 307
如果不想使用具體的方法,也可以直接使用父類的 RedirectToAction 方法。
public RedirectToActionResult Index()
{
return RedirectToAction(actionName: "Index", controllerName: "Home");
}
如果你只需要跳轉到當前 Controller 下的某一個 Action,可以忽略 Controller 名字,如下程式碼所示:
public RedirectToActionResult Index()
{
return RedirectToAction(actionName: "Privacy");
}
使用 RedirectToRouteResult
這是另一種可將 請求跳轉到指定 Action 的方式,你可以使用下面羅列的方法來實現跳轉。
RedirectToRoute 返回 Http 狀態碼為 302
RedirectToRoutePermanent 返回 Http 狀態碼為 301
RedirectToRoutePermanentPreserveMethod 返回 Http 狀態碼為 308
RedirectToRoutePreserveMethod 返回 Http 狀態碼為 307
下面的程式碼片段展示了 如何使用 RedirectToRoute 。
public RedirectToRouteResult Index()
{
return RedirectToRoute("author");
}
也可以通過 RouteValueDictionary 來指定需要跳轉的 Route 值,如下程式碼所示:
var routeValue = new RouteValueDictionary(new { action = "View", controller = "Author"});
return RedirectToRoute(routeValue);
使用 LocalRedirectResult
這個 ActionResult
只用於跳轉到本地url ,也就意味著一旦你跳轉到外部網站的url,肯定會丟擲異常的。可以使用下面羅列的方法來實現跳轉。
LocalRedirect 返回 Http 狀態碼為 302
LocalRedirectPermanent 返回 Http 狀態碼為 301
LocalRedirectPermanentPreserveMethod 返回 Http 狀態碼為 308
LocalRedirectPreserveMethod 返回 Http 狀態碼為 307
跳轉到 Razor 頁面
最後需要了解的一點是,你可以使用 RedirectToPage 方法將請求跳轉到指定的 Razor 頁面,返回 Http狀態碼 302,比如說:你有一個 Author Page,接下來用如下程式碼實現跳轉。
public IActionResult RedirectToAuthorPage()
{
return RedirectToPage("Author");
}
譯文連結:https://www.infoworld.com/article/3570787/how-to-redirect-a-request-in-aspnet-core-mvc.html
更多高質量乾貨:參見我的 GitHub: csharptranslate