2013-04-22 18 views

cevap

12

yanıt doğru, ama sadece yerine GenericFileResponse ait ViewRenderer kullanarak bir örnek eklemek istedim: Örneğin GenericFileResponse için kullanabilirsiniz.

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; 
    } 
} 
+0

Bu, motorların ve düzenlerin görüntülenmesini sağlayacağından çok daha iyi bir yoldur. +1 – sed

+5

"Handle" a tek liner yapmak için 'WithStatusCode 'uzantısını kullanarak bunu biraz daha geliştirebilirsiniz: context.Response = viewRenderer.RenderView (context," /status/404").WithStatusCode(statusCode); ' – Crisfole

10

Sadece IStatusCodeHandler arabiriminin bir uygulamasını sağlamanız gerekir (bu, otomatik olarak Nancy tarafından alınacaktır). HttpStatusCode.NotFound için de geçerlidir HandlesStatusCode yöntem Karşılığında

.

Ve Handle yönteminde

Eğer hata sayfası içeriği içeren bir tepki ile NancyContext üzerinde Response özelliğini ayarlamanız gerekir. nemesv gelen

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;    
    } 
}