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?

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top