0

データベースのコンテンツにアクセスする小さなサイト用のカスタム エラー ページを作成しようとしている MVC3 サイトがあります。

私の設定では、次のようになりました。

<system.web>
  <customErrors mode="On">
    <error statusCode="404" redirect="/404" />
    <error statusCode="500" redirect="/error/500.html" />
  </customErrors>

/404 ルートは、ブラウザで直接アクセスすると機能します。

標準の「404 page not found」が表示されるようになりました。

私のコントローラーで私は得ました:

public ActionResult ShowPage(int test)
{
     var page = _rep.GetPage(test);

     if(page == null)
         return HttpNotFound();    
     //....
}

ここで何が欠けている可能性がありますか?設定に何かが欠けているように感じます

4

2 に答える 2

2

カスタム エラーの場合、私は常に global.asax に次のメソッドを配置します。これにより、エラー コントローラーがアクティブになります (この SO 回答https://stackoverflow.com/a/5229581/426840に基づく)。

protected void Application_Error()
        {
            var exception = Server.GetLastError();
            var httpException = exception as HttpException;

            // Don't execute error controller for custom error mesages when custom error is disabled
            if (!HttpContext.Current.IsCustomErrorEnabled) return;

            Response.Clear();
            Server.ClearError();

            Response.StatusCode = 500;

            // Avoid IIS messing with custome errors https://stackoverflow.com/a/1719474/426840
            // Also https://stackoverflow.com/a/2345742/426840 for web.config
            Response.TrySkipIisCustomErrors = true;

            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();
            }

            var routeData = new RouteData();
            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = Response.StatusCode != 404 ? "Index" : "NotFound";
            routeData.Values["exception"] = exception;
            routeData.Values["logId"] = logId;

            IController errorsController = new ErrorController();

            var rc = new RequestContext(new HttpContextWrapper(Context), routeData);

            errorsController.Execute(rc);
        }

エラーコントローラー:

public class ErrorController : AuthorizedController
    {
        public ActionResult Index(string logId)
        {
            if (Request.IsAjaxRequest())
            {
                return new HttpStatusCodeResult(Response.StatusCode, Response.StatusDescription);
            }

            ViewBag.HttpStatusCode = Response.StatusCode;
            ViewBag.HttpStatusMessage = Response.StatusDescription;
            ViewBag.LogId = logId;

            return View("Error");
        }

        public ActionResult NotFound(string logId)
        {
            if (Request.IsAjaxRequest())
            {
                return new HttpStatusCodeResult(Response.StatusCode, Response.StatusDescription);
            }

            ViewBag.HttpStatusCode = Response.StatusCode;
            ViewBag.HttpStatusMessage = Response.StatusDescription;
            ViewBag.LogId = logId;

            return View("NotFound");
        }
    }

Web.config:

<customErrors mode="On" />

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <!-- Avoid IIS messing with custom errors https://stackoverflow.com/a/2345742/426840 -->
    <httpErrors existingResponse="PassThrough" />

  </system.webServer>

これは 404 に対して機能しますが、他のすべてのエラーに対しても機能します。

于 2013-09-13T06:59:38.963 に答える
1

HttpNotFound結果は空のビューを返します。例外をスローする必要があります

if(page == null)
    throw new HttpException(404, "Not found")
于 2013-09-13T06:31:55.897 に答える