Les contraintes de route Asp.Net Mvc peuvent-elles générer une exception 404 au lieu de InvalidOperationException?
-
10-07-2019 - |
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?
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>