2010-05-20 8 views
5

Mam problem z utworzeniem ogólnego widoku reprezentującego strony NotFound.Tworzenie ogólnego widoku NotFound w ASP.MVC

Widok jest utworzony i jest w porządku. Muszę wiedzieć, w jaki sposób mogę skierować użytkownika do widoku NotFound w moich kontrolerach i jak renderować określony "Return to Index" w każdym kontrolerze.

Oto kod:

public class NotFoundModel 
{ 
    private string _contentName; 
    private string _notFoundTitle; 
    private string _apologiesMessage; 

    public string ContentName { get; private set; } 
    public string NotFoundTitle { get; private set; } 
    public string ApologiesMessage { get; private set; } 

    public NotFoundModel(string contentName, string notFoundTitle, string apologiesMessage) 
    { 
     this._contentName = contentName; 
     this._notFoundTitle = notFoundTitle; 
     this._apologiesMessage = apologiesMessage; 
    } 

    } 

// NOTFOUND Zobacz

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Geographika.Models.NotFoundModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    <%= Html.Encode(Model.ContentName) %> 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2><%= Html.Encode(Model.NotFoundTitle) %></h2> 

    <p><%= Html.Encode(Model.ApologiesMessage) %></p> 

    <!-- How can i render here a specific "BackToIndexView", but that it's not bound to 
    my NotFoundModel? --> 

</asp:Content> 

// Kontroler kawałek kodu

// 
    // GET: /Term/Details/2 
    public ActionResult Details(int id) 
    { 
     Term term = termRepository.SingleOrDefault(t => t.TermId == id); 

     if (term == null) 
      return View("NotFound"); // how can i return the specific view that its not bound to Term Model? 

      // the idea here would be something like: 
      // return View("NotFound",new NotFoundModel("a","b","c")); 

     else 
      return View("Details", term); 
    } 

Nie jestem pewien, jak przekierować do cała inna strona. Czy ktoś może mi podać jakieś wskazówki?

Dzięki

Odpowiedz

4

Bardzo prosty, to jest to, czego używam i ma bardzo mało zależności.

Załóż ErrorController.cs w sterownikach:

public class ErrorController : Controller 
    { 
     public ErrorController() 
     { 
      //_logger = logger; // log here if you had a logger! 
     } 

     /// <summary> 
     /// This is fired when the site gets a bad URL 
     /// </summary> 
     /// <returns></returns> 
     public ActionResult NotFound() 
     { 
      // log here, perhaps you want to know when a user reaches a 404? 
      return View(); 
     } 
    } 
} 

Następnie wystarczy utworzyć Views\Error\NotFound.aspx z następującą zawartością, uszczypnąć, jak czujesz Fit (w tym przycisk „Powrót do domu”, ja to domyślne jeden dla ciebie):

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Oops - No content here! 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>404 Error - Can't find that page</h2> 

    <p>Sorry, we cannot find the page you are looking for</p> 

</asp:Content> 

Wtedy po prostu w MVC app Web.config ciągu <system.web> tagi:

<customErrors mode="Off" defaultRedirect="/error/problem"> 
    <error statusCode="404" redirect="/error/notfound"/> 
</customErrors> 

Nie jest wymagana niestandardowa trasa, jeśli używasz standardowej trasy typu catch-all. Nadzieja, która pomaga.

+0

Fajnie, bardzo prosto! –

0

dziękuję za twój wkład. Myślenie ciężko tutaj, udało mi się utworzyć jeden pojedynczy widok NOTFOUND i model takiego:

public class NotFoundModel 
{ 
    private string _contentName; 
    private string _notFoundTitle; 
    private string _apologiesMessage; 
    private string _linkText; 
    private string _action; 
    private string _controller; 

    // properties omitted for brevity; 

    public NotFoundModel(string contentName, string notFoundTitle, string apologiesMessage, 
     string linkText, string action, string controller) 
    { 
     this._contentName = contentName; 
     this._notFoundTitle = notFoundTitle; 
     this._apologiesMessage = apologiesMessage; 
     this._linkText = linkText; 
     this._action = action; 
     this._controller = controller; 
    } 

    } 

moim zdaniem

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Geographika.Models.NotFoundModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    <%= Html.Encode(Model.ContentName) %> 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2><%= Html.Encode(Model.NotFoundTitle) %></h2> 

    <p><%= Html.Encode(Model.ApologiesMessage) %></p> 

    <%= Html.ActionLink(Model.LinkText,Model.Action,Model.Controller) %> 

</asp:Content> 

i jest to przykład tego, jak używam go:

public ActionResult Delete(int id) 
    { 
     Term term = termRepository.SingleOrDefault(t => t.TermId == id); 

     if (term == null) 
      return View("NotFound", new NotFoundModel("Termo não encontrado", "Termo não encontrado", 
      "Nos desculpe, mas não conseguimos encontrar o termo solicitado.", "Indíce de Termos", "Index", "Term")); 
     else 
      return View("Delete"); 
    } 

W jakiś sposób ASP.MVC szukał wszystkich widoków NotFound w folderach udostępnionych, więc jako jedyny, renderował ten z linkiem do odpowiedniego linku "Przejdź do indeksu modelu".

Dzięki za pomoc.

Powiązane problemy