Kann Asp.Net Mvc Strecke Constraints 404 statt InvalidOperationException werfen?
-
10-07-2019 - |
Frage
Ich versuche Route Einschränkungen in einer Asp.Net MVC-Anwendung zu verwenden.
routes.MapRoute(
"theRoute",
"MyAction/{page}",
new { controller = "TheController", action = "MyAction", page = 1 },
new { page = @"[0-9]" });
Wenn ich eine URL wie ~ / MyAction / aString eingeben, wird ein YSOD mit einer ungültigen Operation Ausnahme dargestellt. Was kann ich tun, um ungültige URL zur 404-Seite zu umleiten?
Ich weiß, dass ich das Problem mit einem String-Parametern in der Controller-Aktion und int.TryParse lösen kann, aber dann ist die Strecke constaint ist nutzlos.
Wie kann ich wählen Sie die Exception, die durch die Route Einschränkungen geworfen wird?
Lösung
Das Problem ist, dass Sie nicht über eine Route, die die Route übereinstimmt, die in einem String endet.
Ändern Sie bitte Ihre Routen ähnlich wie:
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
);
und ändern Sie Ihre 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");
}
jetzt, wenn Sie eine Zeichenfolge für die ID übergeben, wird Index2 genannt werden, und Sie können tun, was Sie die falschen Parameter tun müssen, behandeln.
Andere Tipps
Nur eine allgemeinere Umleitung zu erwähnen:
Sie können in der Web.config Ihrer Anwendung schreiben:
<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>
Dann benötigen Sie einen ActionResult
genannt MyCustomError
haben
public class HomeController : Controller
{
...
...
public ActionResult MyCustomError(string aspxerrorpath)
/* the var aspxerrorpath
* is that MVC generated by
* default */
{
ViewData["messageError"] = aspxerrorpath;
return View();
}
}
Dann können Sie eine benutzerdefinierte Fehlerseite machen:
<%@ 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>