2011-01-12 15 views
5

Po pierwsze, jestem nowy w MVC, więc proszę przeprosić pytanie, czy jest to podstawowe.Uzyskiwanie wartości parametru o wartości zerowej w kontrolerze po uruchomieniu trasy MVC

Używam niestandardowej trasy do utworzenia następującego adresu URL (http: // mysite/subscriber/12345), gdzie 12345 jest numerem subskrybenta. Chcę uruchomić akcję ShowAll w kontrolerze Subscriber. Moja trasa uruchamia się i używa Phil's route debugger, kiedy przechodzę w powyższym adresie URL, debugger trasy pokazuje ID jako 12345.

Mój kontroler akceptuje int jako identyfikator subskrybenta. Po uruchomieniu kontroler zgłasza błąd "Słownik parametrów zawiera wpis o wartości null dla parametru" id "typu nieululującego" System.Int32 ". Dlaczego debuger trasy pokazuje wartość, a kontroler jej nie widzi?

Oto moja trasa (pierwsza jest winowajcą)

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 
      ); 

Każdy pomysł, dlaczego ja dostaję null w akcji ShowAll? Oto podpis metoda działania:

public ActionResult ShowAll(int id) 
+0

Czy możesz zaksięgować wszystkie rejestracje tras z podpisem metody działania? –

+0

Tak. Zaktualizowano pytanie. –

+0

Myślę, że problem tkwi w twoim ograniczeniu. Nie jestem ninja z regexem, więc nie mogę ci tam pomóc. –

Odpowiedz

5

Stwierdzono, że podpis metoda kontroler musi zaakceptować ciąg jako MVC nie wie, co wpisz parametr przekazujący i dlatego nie może go przesłać do int, ale może wymusić go za pomocą ograniczenia.

Więc, drogi skończyło się to tak:

routes.MapRoute ( "SubscriberAll" "abonent/{id}", new {controller = "Abonent" action = "ShowAll"}, nowy {id = @ "\ d +"} // potwierdź numeryczny );

i podpis metoda kontroler Skończyło się to tym

public ActionResult ShowAll(string id) 
+2

To nie jest dokładne; w rzeczywistości MVC próbuje przeanalizować dowolny ciąg znaków, który przekazujesz w adresie URL do int. Używanie public ActionResult ShowAll (string id) + nowy {controller = "Home", action = "Index", id = UrlParameter.Optional} powinno działać tak długo, dopóki parametr id jest typu int i wywoływany id, nic więcej jak personId. – usefulBee

+1

@usefulBee: dzięki za pisanie _ "i zadzwoniłem do id, nic więcej jak personId" _, właśnie zdałem sobie sprawę, że popełniłem ten błąd w moim kodzie, a teraz czuję się jak idiota, ale mój problem został rozwiązany! : D Dzięki.Myślę, że powinieneś opublikować to jako osobną odpowiedź (przynajmniej uzyskałbyś ode mnie uprowadzenie). – Sk8erPeter

+1

Omg, nieumyślnie zmieniłem nazwę parametru z id na bardziej konkretną, która zepsuła routing. –

1

Spróbuj usunąć identyfikator z listy domyślnych czyli po prostu

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

Nadal pojawia się błąd. Chcę, aby identyfikator był wymagany. –

+0

@ asp316 zaktualizowałam moją odpowiedź – Vadim

1

Zamiast pisać "id = 0" w zapisie MapRoute "id = UrlParameter.Optional"

to na pewno pracować z wynikiem akcji

public ActionResult ShowAll(int id) 

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