一般的な「リソースが見つかりません」ASP.NETエラーを表示する代わりに、誰かがASP.NET MVCで有効なアクションまたはコントローラーを呼び出さないURLを入力すると、カスタムHTTP 404エラーページを作成しようとしています。
これを処理するためにweb.configを使用したくありません。
無効なURLをキャッチするためにできるルーティングマジックはありますか?
更新:指定された答えを試しましたが、,い「リソースが見つかりません」というメッセージが表示されます。
別の更新: OK、明らかに何かがRC1で変更されました。 HttpException
に404をトラップしようとしても、「リソースが見つかりません」ページが表示されるだけです。
私もMvcContribのリソースの機能を使用しましたが、同じ問題がありません。何か案は?
ルートテーブルの最後にキャッチオールルートを追加し、必要なページを表示します。
参照: ASP.NET MVCの「404ページが見つかりません」クエリを処理するためにキャッチオールルートを作成するにはどうすればよいですか?
実稼働サーバーでカスタムエラーを3時間有効にしようとしましたが、ルートなしでASP.NET MVCでこれを行う方法の最終的なソリューションを見つけたようです。
ASP.NET MVCアプリケーションでカスタムエラーを有効にするには、IIS 7以降が必要です。
system.web
セクションの下のWeb設定でカスタムページを設定します。
<customErrors mode="RemoteOnly" defaultRedirect="~/error">
<error statusCode="404" redirect="~/error/Error404" />
<error statusCode="500" redirect="~/error" />
</customErrors>
RemoteOnly
は、ローカルネットワークで実際のエラーが表示されることを意味します(開発中に非常に役立ちます)。エラーコードのエラーページを書き換えることもできます。
マジックレスポンスパラメータとレスポンスステータスコードの設定(エラー処理モジュールまたはエラーハンドル属性)
HttpContext.Current.Response.StatusCode = 500;
HttpContext.Current.Response.TrySkipIisCustomErrors = true;
system.webServer
セクションの下のWeb設定で別の魔法の設定を設定します。
<httpErrors errorMode="Detailed" />
これは私が見つけた最後のことであり、この後、実稼働サーバーでカスタムエラーを確認できます。
この記事のビューを返すErrorControllerを作成することで、エラー処理が機能するようになりました。また、global.asaxのルートに「Catch All」を追加する必要がありました。
Web.configにない場合、これらのエラーページにどのように到達するかわかりません。私のWeb.configは以下を指定する必要がありました。
customErrors mode="On" defaultRedirect="~/Error/Unknown"
そして、私も追加しました:
error statusCode="404" redirect="~/Error/NotFound"
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.
のようなエラーメッセージを受け取ります
お役に立てれば :)
P.S: Andrew Davey このような素晴らしいプラグインを作成してくれてありがとう。
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>
このソリューションでは、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>
MVC 4で作業している場合、 this ソリューションを見ることができます。
次のApplication_Errorメソッドを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 の完全なソースコードを確認してください。
エラーページを1か所で完全にカスタマイズできる、真の答えを次に示します。 web.configを変更したり、別のコードを作成する必要はありません。
MVC 5でも機能します。
このコードをコントローラーに追加します。
if (bad) {
Response.Clear();
Response.TrySkipIisCustomErrors = true;
Response.Write(product + I(" Toodet pole"));
Response.StatusCode = (int)HttpStatusCode.NotFound;
//Response.ContentType = "text/html; charset=utf-8";
Response.End();
return null;
}
http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages に基づく
特定のケースについてお話しますが、
以下のようにHomeControllerで「PageNotFoundメソッド」を使用している場合
[Route("~/404")]
public ActionResult PageNotFound()
{
return MyView();
}
これは機能しません。ただし、以下のようなルートタグをクリアする必要があります。
//[Route("~/404")]
public ActionResult PageNotFound()
{
return MyView();
}
そして、web.configのメソッド名としてそれを変更した場合動作しますただし、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>
私は同じ問題を抱えていました、あなたがしなければならないことは、viewsフォルダのweb.configファイルにcustomErrors属性を追加する代わりに、プロジェクトルートフォルダのweb.configファイルに追加する必要があることです