[英]How to redirect to a route in an ActionResult in ASP.Net MVC 3
我正在嘗試創建一個拒絕ActinoResult的訪問權限從我的控制器返回。 我有以下實現
public class AccessDeniedResult : ActionResult
{
public override void ExecuteResult(ControllerContext context)
{
if (null != context && null != context.HttpContext && null != context.HttpContext.Response)
{
context.HttpContext.Response.StatusCode = 401;
context.HttpContext.Response.RedirectToRoute("AccessDenied");
}
}
}
這不起作用,因為來自HttpResponseBase的NotImplementedException作為context.HttpContext.Response傳遞。
你如何在MVC3中編寫正確的重定向動作結果?
你應該像這樣返回HttpUnauthorizedResult:
return new HttpUnauthorizedResult();
此外,您應該考慮創建一個派生自AuthorizeAttribute的新類來進行安全檢查。 然后,您可以將此指令添加到web.config以控制客戶端的定向位置:
<customErrors mode="On" defaultRedirect="~/Home/Error">
<error statusCode="401" redirect="~/AccessDenied" />
</customErrors>
最后,您可以添加自定義路由來控制將用戶定向到〜/ AccessDenied時發生的情況:
Route route = routes.MapRoute("AccessDeniedRoute", "AccessDenied", new { controller = "MyCustomErrorController", action = "My401Action" });
RouteTable.Routes.Add(route);
也許你應該嘗試繼承RedirectToRouteResult(繼承ActionResult)。
您還可以查看該類的源代碼,了解它們是如何做到的:
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
if (context.IsChildAction) {
throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
}
string destinationUrl = UrlHelper.GenerateUrl(RouteName, null /* actionName */, null /* controllerName */, RouteValues, Routes, context.RequestContext, false /* includeImplicitMvcValues */);
if (String.IsNullOrEmpty(destinationUrl)) {
throw new InvalidOperationException(MvcResources.Common_NoRouteMatched);
}
context.Controller.TempData.Keep();
if (Permanent) {
context.HttpContext.Response.RedirectPermanent(destinationUrl, endResponse: false);
}
else {
context.HttpContext.Response.Redirect(destinationUrl, endResponse: false);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.