0

「エラー」コントローラーにあるアクション「PageNotFound」を返そうとしています。

public class BaseController : Controller
{
 public BaseController()
 {
 }

 public BaseController(IContentRepository contentRep, ILocalizedRepository localRep)
 {
    this._localRep = localRep;
    this._contentRep = contentRep;
 }

 protected new HttpNotFoundResult HttpNotFound(string statusDescription = null)
 {
    return new HttpNotFoundResult(statusDescription);
 }

protected HttpUnauthorizedResult HttpUnauthorized(string statusDescription = null)
{
    return new HttpUnauthorizedResult(statusDescription);
}

 protected class HttpNotFoundResult : HttpStatusCodeResult
 {
    public HttpNotFoundResult() : this(null) { }

    public HttpNotFoundResult(string statusDescription) : base(404, statusDescription) { }
 }

 protected class HttpUnauthorizedResult : HttpStatusCodeResult
 {
    public HttpUnauthorizedResult(string statusDescription) : base(401, statusDescription) { }
 }

 protected class HttpStatusCodeResult : ViewResult
 {
    public int StatusCode { get; private set; }
    public string StatusDescription { get; private set; }

    public HttpStatusCodeResult(int statusCode) : this(statusCode, null) { }

    public HttpStatusCodeResult(int statusCode, string statusDescription)
    {
        this.StatusCode = statusCode;
        this.StatusDescription = statusDescription;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        context.HttpContext.Response.StatusCode = this.StatusCode;
        if (this.StatusDescription != null)
        {
            context.HttpContext.Response.StatusDescription = this.StatusDescription;
        }

        this.ViewName = "PageNotFound";  // CONTROLLER MISSING
        this.ViewBag.Message = context.HttpContext.Response.StatusDescription;
        base.ExecuteResult(context);
     }
 }

「エラー」コントローラーで「PageNotFound」アクションを返すように変更するにはどうすればよいですか?

4

3 に答える 3

2

ViewResultは、ビューを直接レンダリングすることになっています (オプションでモデルとレイアウトを渡します) 。このプロセスに関与するコントローラーはありません。

コントローラーを通過したい場合は、リダイレクトを実行する必要があります。つまり、RedirectToRouteResult代わりに を使用しViewResultます。

あなたの例では、このカスタム ViewResult を他のコントローラー内で直接使用しています。これが、エラー ビューをレンダリングするコントローラーになります。

于 2013-09-16T06:39:02.267 に答える
1

リダイレクトを作成する理由がわかりません。私は404を返します

return HttpStatusCode(404);

次に、 ASP.NET MVC 404 エラー処理で説明されているアプローチを使用して、正しいビューをレンダリングします。利点: URL は変わらず、エラー処理とブラウザー履歴がはるかに簡単になります。

于 2013-09-16T09:08:32.187 に答える