Asp.Net Mvc Route Vincoli può generare un 404 invece di InvalidOperationException?
-
10-07-2019 - |
Domanda
Sto cercando di utilizzare i vincoli di percorso in un'applicazione MVC Asp.Net.
routes.MapRoute(
"theRoute",
"MyAction/{page}",
new { controller = "TheController", action = "MyAction", page = 1 },
new { page = @"[0-9]" });
Quando inserisco un URL come ~ / MyAction / aString, viene visualizzato un YSOD con un'eccezione di operazione non valida. Cosa posso fare per reindirizzare l'URL non valido alla pagina 404?
So di poter risolvere il problema con un parametro di stringa nell'azione del controller e int. TryParse, ma poi la restrizione del percorso è inutile.
Come posso scegliere il tipo di eccezione generato dai vincoli del percorso?
Soluzione
Il problema è che non hai una route che corrisponde alla route che termina in una stringa.
Modifica i tuoi percorsi in modo simile 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
);
e modifica il tuo controller
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");
}
ora quando passi una stringa per l'ID, verrà chiamato Index2 e puoi fare tutto ciò che devi fare per gestire il parametro errato.
Altri suggerimenti
Solo per citare un reindirizzamento più generale:
Puoi scrivere nel Web.config della tua applicazione:
<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>
Quindi devi avere un ActionResult
chiamato MyCustomError
public class HomeController : Controller
{
...
...
public ActionResult MyCustomError(string aspxerrorpath)
/* the var aspxerrorpath
* is that MVC generated by
* default */
{
ViewData["messageError"] = aspxerrorpath;
return View();
}
}
Quindi puoi creare una pagina di errore personalizzata:
<%@ 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>