Frage

Warum passiert Folgendes? Html.ActionLink Anruf:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

Generieren Sie eine URL mit Abfrageparametern anstelle einer „ruhenden“ URL, d. h.:

http://localhost/Website/Case/Advance/1?step=Refer

Ich habe nur die Standardroute registriert. Benötige ich zusätzliche Routen, die den Parameter „StepType“ verstehen können?

Ich habe versucht, diese Route hinzuzufügen nach die Standardroute:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

aber es hatte keine Wirkung.Hinzufügen der neuen Routenregistrierung Vor Die Standardeinstellung gab mir einen Fehler:

Das Parameter-Dictionary enthält einen Nulleintrag für Parameter 'ID' von nicht minderwertigem Typ 'system.int64' für Method 'System.Web.Mvc.ActionResult Advance (int64, Website.Core.steptype)' in 'Website.Controllers.CaseController '.Um einen Parameter optional zu erstellen, sollte sein Typ entweder ein Referenztyp oder ein nullierbarer Typ sein.

War es hilfreich?

Lösung

Benutzerdefinierte Route fängt im Moment zu viel ein

Ihre Ausnahme sagt Ihnen lediglich, dass Ihre benutzerdefinierte Route etwas abfängt, das Sie nicht abfangen wollten.Wenn also eine Anfrage an die Stamm-URL Ihrer Anwendung gestellt würde:

http://localhost/Website

Ihre benutzerdefinierte Route würde es erfassen.Und legen Sie die Standardeinstellungen fest.Und rufen Sie an CaseController.Advance() Aktion.Und natürlich eine Ausnahme auslösen, weil id ist nicht definiert.

Behalten Sie Ihre benutzerdefinierte Route vor der Standardroute

Sie müssen jedoch Ihre benutzerdefinierte Route ändern oder Routenbeschränkungen hinzufügen, damit tatsächlich nur die Anfragen abgefangen werden, die sie abfangen soll.

Aber welche Änderung sollten Sie vornehmen?Wenn nur ein einziger Controller dies benötigt, ändern Sie es wie folgt:

routes.MapRoute(
    "CaseAdvance",
    "Case/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});

Wenn es noch andere Controller gibt, können Sie es so lassen, wie es war, indem Sie einfach Einschränkungen hinzufügen:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { controller = "Case|Other" });

Wenn es einen Controller geben kann, können Sie verlangen, dass Ihre ID numerisch ist:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { id = @"\d+" })

In diesem Fall fängt diese Route nur die Anfragen ab, für die tatsächlich eine ID definiert ist.Als Nummer natürlich.

Sie werden wissen, welches am besten zu Ihnen passt.

Andere Tipps

Ja, wenn es keine Route wie "{Controller}/{action}/{id}/{Step}" gibt, übergibt die ActionLink -Methode einfach "Schritt" als QueryString -Parameter.

In Ihrer Route haben Sie einen Parameter von StepType angegeben, aber Ihr Passieren eines Parameters, der als Schritt bezeichnet wird.

Ihre ActionLink -Parameternamen müssen mit den Namen der Routenparameter übereinstimmen, oder Sie erhalten genau das, was Sie sehen.

Bearbeiten: OK, Sie haben Ihren Code geändert, während ich diese Antwort eingegeben habe !!

Versuchen Sie es zu verwenden Routelink Und sehen Sie, ob das für Sie funktioniert.

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

Wenn das Aufrufen von Routelink einen gültigen Link erzeugt, wird Ihre Route zumindest ordnungsgemäß eingerichtet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top