5 Stimmen

Null-Parameterwert im Controller erhalten, wenn eine MVC-Route ausgelöst wird

Zunächst einmal bin ich neu in MVC, so entschuldigen Sie bitte die Frage, wenn es grundlegend ist.

Ich verwende eine benutzerdefinierte Route, um die folgende URL zu erstellen ( http://mysite/subscriber/12345 ), wobei 12345 die Teilnehmernummer ist. Ich möchte, dass es die ShowAll Aktion im Subscriber Controller. Meine Route ist feuernd und verwendet Phil's Routen-Debugger Wenn ich die obige URL eingebe, zeigt der Routendebugger die ID 12345 an. Mein Controller akzeptiert einen int als subscriberID . Wenn sie ausgelöst wird, wirft der Controller den Fehler

Das Parameterwörterbuch enthält einen Nulleintrag für den Parameter 'id' vom nicht-nullbaren Typ 'System.Int32'.

Warum zeigt der Routendebugger einen Wert an und der Controller sieht ihn nicht?

Hier ist meine Route (die erste ist der Übeltäter)

 routes.MapRoute(
              "SubscriberAll",
              "subscriber/{id}",
              new { controller = "Subscriber", action = "ShowAll", id=0 },
              new { id = @"\d+" } //confirm numeric
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

Irgendeine Idee, warum ich eine Null in der ShowAll Aktion? Hier ist die Signatur der Aktionsmethode:

 public ActionResult ShowAll(int id)

5voto

Bill Martin Punkte 4745

Ich habe festgestellt, dass die Controller-Methodensignatur eine Zeichenkette akzeptieren muss, da MVC nicht weiß, welcher Typ der übergebene Parameter ist und ihn daher nicht in int umwandeln kann, aber es kann ihn durch die Einschränkung erzwingen.

Ich habe mich also für den folgenden Weg entschieden:

routes.MapRoute( "SubscriberAll", "subscriber/{id}", new {controller = "Abonnent", action = "ShowAll" }, new {id = @" \d +" } //numerisch bestätigen );

und die Controller-Methodensignatur, die ich am Ende hatte, ist diese

 public ActionResult ShowAll(string id)

1voto

Vadim Punkte 17727

Versuchen Sie, id aus der Liste der Standardwerte zu entfernen, d. h. nur noch

new { controller = "Subscriber", action = "ShowAll" }

1voto

Niladri Punkte 53

Anstatt "id = 0" in Ihre MapRoute zu schreiben, schreiben Sie "id = UrlParameter.Optional".

dies würde mit dem Ergebnis Ihrer Aktion definitiv funktionieren

public ActionResult ShowAll(int id)

routes.MapRoute(
                  "SubscriberAll",
                  "subscriber/{id}",
                  new { controller = "Subscriber", action = "ShowAll", id = UrlParameter.Optional },
                  new { id = @"\d+" } //confirm numeric
                );

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X