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?

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top