在ASP.Net MVC中,可以使用Redirect
或RedirectToAction
来调用例如303错误吗?
我正在通过一本名为“ASP.NET MVC 1.0网站编程”的书,并且来源正在调用诸如return this.Redirect(303, FormsAuthentication.DefaultUrl);
这样的调用,但这个调用只能用于外部库,我想拥有如果可能的话,相同的功能没有附加组件。
答案 0 :(得分:4)
您可以创建模仿任何您想要的http响应代码的自定义ActionResults。通过返回这些操作结果,您可以轻松执行303。
我发现this quick write-up您应该能够轻松跟进。
答案 1 :(得分:4)
以下是我根据当前答案中提供的建议和反编译的System.Web.Mvc.RedirectResult
代码提出的建议:
public class SeeOtherRedirectResult : ActionResult
{
public string Url { get; private set; }
public HttpStatusCode StatusCode { get; private set; }
public SeeOtherRedirectResult(string url, HttpStatusCode statusCode)
{
if (String.IsNullOrEmpty(url))
{
throw new ArgumentException("URL can't be null or empty");
}
if ((int) statusCode < 300 || (int) statusCode > 399)
{
throw new ArgumentOutOfRangeException("statusCode",
"Redirection status code must be in the 3xx range");
}
Url = url;
StatusCode = statusCode;
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (context.IsChildAction)
{
throw new InvalidOperationException("Cannot redirect in child action");
}
context.Controller.TempData.Keep();
context.HttpContext.Response.StatusCode = (int) StatusCode;
context.HttpContext.Response.RedirectLocation =
UrlHelper.GenerateContentUrl(Url, context.HttpContext);
}
}
答案 2 :(得分:1)
关于这个的两种方法 -
Response.Redirect(url, false); //status at this point is 302
Response.StatusCode = 303;
-OR -
Response.RedirectLocation = url;
Response.StatusCode = 303;
请注意,在第一个重定向中,false参数避免了重定向(url)通常抛出的threadAbort异常。这是使用这两种方法之一的一个很好的理由。
答案 3 :(得分:0)
您也可以使用自定义ActionFilter来完成它,就像我提到here一样。我喜欢ActionFilter,更多的是ActionResult。