3

J'essaie d'utiliser des contraintes de route dans une application Asp.Net MVC.Les contraintes de route Mvc Asp.Net peuvent-elles générer un 404 au lieu de InvalidOperationException?

routes.MapRoute(
    "theRoute", 
    "MyAction/{page}", 
    new { controller = "TheController", action = "MyAction", page = 1 }, 
    new { page = @"[0-9]" }); 

Quand j'entrer une URL comme ~/MonAction/aString, un YSOD est représenté avec une exception d'opération non valide. Que puis-je faire pour rediriger l'URL invalide vers la page 404?

Je sais que je peux résoudre le problème avec un paramètre de chaîne dans l'action du contrôleur et int.TryParse, mais la contrainte d'itinéraire est inutile.

Comment puis-je choisir le type d'exception renvoyé par les contraintes de routage?

Répondre

3

Le problème est que vous n'avez pas un itinéraire qui correspond à l'itinéraire qui se termine par une chaîne.

Modifier vos itinéraires similaires à:

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = 0 }, 
    new { id = "[0-9]" }// Parameter defaults 
); 
routes.MapRoute(
    "Default2",            // Route name 
    "{controller}/{action2}/{sid}",       // URL with parameters 
    new { controller = "Home", action = "Index2", sid = "" } // Parameter defaults 
); 

et modifier votre contrôleur

public ActionResult Index(int id) 
    { 
     ViewData["Title"] = "Home Page"; 
     ViewData["Message"] = "Welcome to ASP.NET MVC! Your id is: "+ id.ToString(); 

     return View(); 
    } 

    public ActionResult Index2(string sid) 
    { 
     ViewData["Title"] = "Home Page 2."+sid.ToString(); 
     ViewData["Message"] = "Welcome to ASP.NET MVC! \"" + sid.ToString() +"\" is an invalid id"; 

     return View("index"); 
    } 

maintenant lorsque vous passez une chaîne pour l'ID, Index2 sera appelé et vous pouvez faire tout ce que vous devez faire pour gérer le paramètre incorrect.

0

Juste pour mentionner une réorientation plus générale:

Vous pouvez écrire dans le web.config de votre application:

<system.web> 
    ... 
    ... 
    <customErrors mode="On"> 
     <error 
      statusCode="404" 
      redirect="/Home/MyCustomError" /> 
           <!-- Is not necessary that the 
             view MyCustomError.aspx are inside the 
             Home folder, you can put that 
             view in the Shared folder. 
           --> 
    </customErrors> 
    ... 
    ... 
</system.web> 

Ensuite, vous devez avoir un ActionResult appelé MyCustomError

public class HomeController : Controller 
{ 
    ... 
    ... 

    public ActionResult MyCustomError(string aspxerrorpath) 
                /* the var aspxerrorpath 
                * is that MVC generated by 
                * default */ 
    { 
     ViewData["messageError"] = aspxerrorpath; 
     return View(); 
    } 
} 

Ensuite, vous pouvez faire une page d'erreur personnalisée:

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

<asp:Content ID="errorTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Error 
</asp:Content> 

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Shit happends</h2> 
    <p> <%: ViewData["messageError"]%></p> 
    <p>aaaaaaaaaaaaaaa!!!!!!!!!!!!!!!!!!!!</p> 
</asp:Content> 
Questions connexes