Les contraintes de route Asp.Net Mvc peuvent-elles générer une exception 404 au lieu de InvalidOperationException?

StackOverflow https://stackoverflow.com/questions/314558

Question

J'essaie d'utiliser des contraintes de route dans une application Asp.Net MVC.

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

Lorsque je saisis une URL du type ~ / MyAction / aString, un YSOD s'affiche avec une exception d'opération non valide. Que puis-je faire pour rediriger une URL non valide 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 constellation de la route est alors inutile.

Comment choisir le type d'exception renvoyé par les contraintes de route?

Était-ce utile?

La solution

Le problème est que vous ne disposez pas d'un itinéraire correspondant à celui se terminant par une chaîne.

Modifiez vos itinéraires comme suit:

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 modifiez 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 pourrez faire ce que vous devez faire pour gérer le paramètre incorrect.

Autres conseils

Juste pour mentionner une redirection plus générale:

Vous pouvez écrire dans le fichier 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 disposer d'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();
    }
}

Vous pouvez ensuite créer 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top