¿Pueden Asp.Net Mvc Route Restraints lanzar un 404 en lugar de InvalidOperationException?
-
10-07-2019 - |
Pregunta
Estoy tratando de usar restricciones de ruta en una aplicación Asp.Net MVC.
routes.MapRoute(
"theRoute",
"MyAction/{page}",
new { controller = "TheController", action = "MyAction", page = 1 },
new { page = @"[0-9]" });
Cuando ingreso una url como ~ / MyAction / aString, se muestra un YSOD con una excepción de operación no válida. ¿Qué puedo hacer para redirigir una URL no válida a la página 404?
Sé que puedo resolver el problema con un parámetro de cadena en la acción del controlador y int. TryParse, pero la ruta constante es inútil.
¿Cómo puedo elegir el tipo de excepción que generan las restricciones de ruta?
Solución
El problema es que no tiene una ruta que coincida con la ruta que termina en una cadena.
Modifique sus rutas de forma similar a:
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
);
y modifique su controlador
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");
}
ahora, cuando pasa una cadena para la ID, se llamará a Index2 y puede hacer lo que sea necesario para manejar el parámetro incorrecto.
Otros consejos
Solo por mencionar una redirección más general:
Puede escribir en la configuración Web de su aplicación:
<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>
Entonces necesita tener un ActionResult
llamado MyCustomError
public class HomeController : Controller
{
...
...
public ActionResult MyCustomError(string aspxerrorpath)
/* the var aspxerrorpath
* is that MVC generated by
* default */
{
ViewData["messageError"] = aspxerrorpath;
return View();
}
}
Entonces puede hacer una página de error personalizada:
<%@ 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>