2

これが私がそれをどのように定義したかです(ローカルで、私の開発マシンで):

    <customErrors mode="On" defaultRedirect="Error.aspx">
        <error statusCode="404" redirect="NotFound.aspx" />
    </customErrors>

そして、私は[HandleError]属性を持っています:

[Authorize]
[HandleError]
public class HomeController : Controller
{ // etc.

しかし、http:// localhost:1986 / blahと入力すると、次のエラーが発生します。

リソースが見つかりません。説明:HTTP404。探しているリソース(またはその依存関係の1つ)が削除されたか、名前が変更されたか、一時的に使用できなくなった可能性があります。次のURLを確認し、スペルが正しいことを確認してください。

要求されたURL:/NotFound.aspx

アクセスしようとしているURLは、予想どおりです: http:// localhost:1986 / NotFound.aspx?aspxerrorpath = / blah

そのため、カスタムエラーファイルに移動しようとしていますが、見つかりません。共有ディレクトリにNotFound.aspxがあります。これは、Microsoftがデフォルトで提供しているError.aspxと同じ場所です。なぜそれを見つけることができないのですか?

4

3 に答える 3

3

Error.aspxとNotFound.aspxが共有ディレクトリにある場合、それらを提供するために配線されたコントローラーはありますか?ファイルを提供するように構成されたある種のコントローラールートがない場合、それらが共有フォルダーにあるという事実は関係ありません。

いくつかのオプションがあります。これらのビューのリクエストを処理し、これらのコントローラーアクションを指すルートを定義するErrorControllerを作成できます。

[OutputCache(CacheProfile = "Default", VaryByParam = "none")]
public class ErrorController : DefaultAreaBaseController
{
    public ViewResult ServiceUnavailable() {
        Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;

        return View("ServiceUnavailable");
    }

    public ViewResult ServerError() {
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        return View("ServerError");
    }

    public new ViewResult NotFound() {
        Response.StatusCode = (int)HttpStatusCode.NotFound;

        return View("NotFound");
    }
}

または、別の方法として、物理ファイルを指す無視ルートを作成し、エラーページをViewsフォルダー以外の場所(ルートディレクトリなど)に配置することもできます。

routes.IgnoreRoute("Error.aspx/{*pathInfo}");
routes.IgnoreRoute("NotFound.aspx/{*pathInfo}");

これらのソリューションはどちらも実行可能ですが、設定によっては、静的エラーページを提供するためだけにリクエストをMVCにパイプする必要がないため、IgnoreRoute()を使用する方が理想的です。

于 2010-08-05T16:56:25.803 に答える
3

オプション1:

「不明」ビューとともに「NotFound」ビューを使用してエラーコントローラを構築することです。これにより、500サーバーエラーまたは404 NotFoundエラーが発生し、適切なURLにリダイレクトされます。訪問者は常にエラーページにリダイレクトされるため、このソリューションが完全に気に入っているわけではありません。

http://example.com/Error/Unknown

<customErrors mode="On" defaultRedirect="Error/Unknown">
    <error statusCode="404" redirect="Error/NotFound" />
    <error statusCode="500" redirect="Error/Unknown" />
</customErrors>
  • wwwroot /
    • コントローラー
      • Error.cs
    • ビュー/
      • エラー/
      • NotFound.aspx
      • Unknown.aspx

オプション2:

私は間違いなくこの方法を好みません(基本的にWebフォームに戻るため、2番目のオプションは静的なError.aspxページを用意し、MVCのルートを無視することです)が、それでも機能します。ここで行っているのは、「静的」ディレクトリを無視し、そこに物理的なエラーページを配置し、MVCを回避することです。

routes.IgnoreRoute("/Static/{*pathInfo}");  //This will ignore everything in the "Static" directory
  • wwwroot /
    • コントローラー/
    • 静的/
      • Error.aspx
    • ビュー/

オプション3:

3番目のオプション(これは私のお気に入りです)は、エラーをキャッチしているビューからエラービューを返すことです。これには、「既知の」エラーの途中でTry / Catchブロックをコード化する必要があります。その後、忍び寄る可能性のある未知のエラーに対してHandleErrorを使用できます。これにより、最初に要求されたURLは保持されますが、エラービューが返されます。

例: http //example.com/Products/1234は、ProductID 1234の詳細ページを表示します
http://example.com/Products/9999は、ProductID 9999が存在しないため、NotFoundエラーページを表示しますhttp:// example .com / Errors / NotFoundは、コントローラーでこれらのエラーを個別に処理するため、表示されるべきではありません。

Web.Config

<customErrors mode="On">
</customErrors>

コントローラ

// Use as many or as few of these as you need
[HandleError(ExceptionType = typeof(SqlException), View = "SqlError")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullError")]
[HandleError(ExceptionType = typeof(SecurityException), View = "SecurityError")]
[HandleError(ExceptionType = typeof(ResourceNotFoundException), View = "NotFound")]
Public Class ProductController: Controller{
    public ViewResult Item(string itemID)
    {
        try
        {
            Item item = ItemRepository.GetItem(itemID);
            return View(item);
        }
        catch()
        {
            return View("NotFound");
        }
    }
}

フォルダ構造

  • wwwroot /
    • コントローラー/
    • 共有/
      • NotFound.aspx
      • NullError.aspx
      • SecurityError.aspx
      • SqlError.aspx
    • ビュー/

オプション4:

最後のオプションは、のようなもののために独自のカスタムフィルタを作成し、ResourceNotFoundExceptionそれをコントローラクラスにアタッチすることです。これは上記とまったく同じことを行いますが、エラーコードをクライアントに送信するという追加の利点もあります。

RichardDingwallが彼のブログでそれについて語っています。

于 2010-08-05T17:05:29.397 に答える
0

ここで、WebフォームとMVCの概念を混合します。web.configでカスタムエラーをオフにします。次に、HandleError属性で、オプションでタイプとビューを指定します。デフォルトでは、error.aspxがviews \ CurrentControllerで検索され、次にviews\sharedで検索されます。HandleErrorフィルターを使用して404処理を機能させることはできますが、404処理専用のフィルターを作成することをお勧めします。その理由と方法については、以下で詳しく説明します。

http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/

于 2010-08-05T18:07:12.697 に答える