如何在南希显示我的404页面?

use*_*261 10 .net asp.net nancy

我需要在Nancy中显示我的404错误页面

if (ErrorCode == 404)
{
  return View["404.html"];
}
Run Code Online (Sandbox Code Playgroud)

怎么做?

r03*_*r03 12

nemesv的答案是正确的,但我只是想使用ViewRenderer而不是GenericFileResponse添加一个例子.

public class MyStatusHandler : IStatusCodeHandler
{
    private IViewRenderer viewRenderer;

    public MyStatusHandler(IViewRenderer viewRenderer)
    {
        this.viewRenderer = viewRenderer;
    }

    public bool HandlesStatusCode(HttpStatusCode statusCode,
                                  NancyContext context)
    {
        return statusCode == HttpStatusCode.NotFound;
    }

    public void Handle(HttpStatusCode statusCode, NancyContext context)
    {
        var response = viewRenderer.RenderView(context, "/status/404");
        response.StatusCode = statusCode;
        context.Response = response;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以通过使用`WithStatusCode`扩展来使`Handle`成为一个单行:`context.Response = viewRenderer.RenderView(context,"/ status/404")来改善这一点.WithStatusCode(statusCode);` (6认同)

nem*_*esv 11

您只需要提供IStatusCodeHandler界面的实现(它将由Nancy自动选取).

HandlesStatusCode方法中返回true为HttpStatusCode.NotFound.

在该Handle方法中,您需要ResponseNancyContext包含错误页面内容的响应上设置属性.你可以使用例如GenericFileResponse:

public class My404Hander : IStatusCodeHandler
{
    public bool HandlesStatusCode(HttpStatusCode statusCode, 
                                  NancyContext context)
    {
        return statusCode == HttpStatusCode.NotFound;
    }

    public void Handle(HttpStatusCode statusCode, NancyContext context)
    {
        var response = new GenericFileResponse("404.html", "text/html");
        response.StatusCode = statusCode;
        context.Response = response;            
    }
}
Run Code Online (Sandbox Code Playgroud)