120

一般的な "Resource Not Found" ASP.NET エラーを表示する代わりに、ASP.NET MVC で有効なアクションまたはコントローラーを呼び出さない URL を誰かが入力したときに、カスタム HTTP 404 エラー ページを作成しようとしています。

これを処理するために web.config を使用したくありません。

無効な URL をキャッチするためにできるルーティング マジックはありますか?

更新:与えられた答えを試しましたが、いまだに「リソースが見つかりません」というメッセージが表示されます。

別の更新:どうやら RC1 で何かが変更されたようです。特に 404 をトラップしようとしてもHttpException、「リソースが見つかりません」というページが表示されます。

私は MvcContrib のリソースの機能を使用しましたが、何も使用しませんでした - 同じ問題です。何か案は?

4

10 に答える 10

110

運用サーバーでカスタム エラーを 3 時間有効にしようとしましたが、ルートなしで ASP.NET MVC でこれを行う最終的な解決策を見つけたようです。

ASP.NET MVC アプリケーションでカスタム エラーを有効にするには (IIS 7 以降):

  1. system.webセクションの下の Web 構成でカスタム ページを構成します。

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>
    

    RemoteOnlyローカルネットワークでは実際のエラーが表示されることを意味します (開発中に非常に役立ちます)。エラーコードのエラーページを書き換えることもできます。

  2. マジック レスポンス パラメータとレスポンス ステータス コードを設定します (エラー処理モジュールまたはエラー ハンドル属性で)。

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. system.webServerセクションの下の Web 構成で別の魔法の設定を設定します。

    <httpErrors errorMode="Detailed" />
    

これは私が見つけた最終的なものであり、この後、運用サーバーでカスタム エラーを確認できます。

于 2011-09-16T08:58:14.337 に答える
41

この記事のビューを返す ErrorController を作成することで、エラー処理が機能するようになりました。また、global.asax のルートに「Catch All」を追加する必要がありました。

Web.configにない場合、これらのエラーページにどのように到達するかわかりません..? 私のWeb.configは次を指定する必要がありました:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

そして、私も追加しました:

error statusCode="404" redirect="~/Error/NotFound"
于 2009-08-17T16:00:29.883 に答える
28

ソース

NotFoundMVC - ASP.NET MVC3 アプリケーションでコントローラー、アクション、またはルートが見つからない場合は常に、ユーザー フレンドリーな 404 ページを提供します。デフォルトの ASP.NET エラー ページの代わりに、NotFound というビューが表示されます。

このプラグインは、次を使用して nuget 経由で追加できます: Install-Package NotFoundMvc

NotFoundMvc は、Web アプリケーションの起動時に自動的にインストールされます。ASP.NET MVC によって通常スローされる 404 HttpException のさまざまな方法をすべて処理します。これには、欠落しているコントローラー、アクション、およびルートが含まれます。

ステップバイステップのインストールガイド:

1 - プロジェクトを右クリックし、[Nuget パッケージの管理...] を選択します。

2 - 検索しNotFoundMvcてインストールします。 ここに画像の説明を入力

3 - インストールが完了すると、2 つのファイルがプロジェクトに追加されます。以下のスクリーンショットに示すように。

ここに画像の説明を入力

4 - Views/Shared にある、新しく追加された NotFound.cshtml を開き、自由に変更します。ここでアプリケーションを実行し、間違った URL を入力すると、ユーザー フレンドリーな 404 ページが表示されます。

ここに画像の説明を入力

これ以上、ユーザーは次のようなエラーメッセージを受け取りますかServer Error in '/' Application. The resource cannot be found.

お役に立てれば :)

PS :このような素晴らしいプラグインを作成してくれたAndrew Daveyに敬意を表します。

于 2012-11-03T12:07:57.367 に答える
20

IIS エラー ページを置き換えるには、web.config でこれを試してください。これは私が推測する最良の解決策であり、正しいステータス コードも送信します。

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

Tipilaからの詳細情報- カスタム エラー ページ ASP.NET MVC を使用する

于 2012-03-15T06:20:26.173 に答える
15

このソリューションでは、web.config ファイルの変更やキャッチオール ルートは必要ありません。

まず、次のようなコントローラーを作成します。

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

次に、「Views/Error/Index.cshtml」の下にビューを次のように作成します。

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }                     
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

次に、グローバル asax ファイルに以下を追加します。

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError(); 
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        } 
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

これを行った後もカスタム IIS エラー ページが表示される場合は、Web 構成ファイルで次のセクションがコメント化されている (または空になっている) ことを確認してください。

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>
于 2013-03-19T21:58:42.860 に答える
11

ルート テーブルの最後に catch all route を追加して、必要なページを表示するだけです。

参照: ASP.NET MVC の '404 ページが見つかりません' クエリを処理するためのキャッチ オール ルートを作成するにはどうすればよいですか?

于 2009-02-16T17:40:51.630 に答える
6

MVC 4 で作業している場合は、このソリューションを見ることができます。

次の Application_Error メソッドを my に追加しますGlobal.asax

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "Index");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

コントローラー自体は非常にシンプルです。

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

GitHub で Mvc4CustomErrorPageの完全なソース コードを確認してください。

于 2015-05-25T08:30:58.610 に答える
0

私も同じ問題を抱えていました。あなたがしなければならないことは、Viewsフォルダーのweb.configファイルにcustomErrors属性を追加する代わりに、プロジェクトのルートフォルダーのweb.configファイルに追加する必要があるということです。

于 2009-12-27T15:35:27.837 に答える
0

具体的な事例をいくつかお話ししますが、

以下のようにHomeControllerで「PageNotFoundメソッド」を使用している場合

[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

これはうまくいきません。ただし、以下のように Route タグをクリアする必要があります。

//[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

また、web.configでメソッド Name として変更すると機能します。 ただし、web.config で以下のようなコードを実行することを忘れないでください。

<customErrors mode="On">
  <error statusCode="404" redirect="~/PageNotFound" /> 
 *// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>
于 2019-03-11T16:00:00.610 に答える