2011-01-12 14 views
5

patladığında denetleyicide boş parametre değeri ilk olarak kapalı, MVC'ye yeniyim, bu yüzden lütfen temel olup olmadığını sorunuz.Bir MVC güzergahı

Aşağıdaki URL'yi (http: // mysite/subscriber/12345) oluşturmak için özel bir yol kullanıyorum, burada 12345 abone numarasıdır. ShowAll eylemini Abone denetleyicide çalıştırmak istiyorum. Güzergahım, yukarıdaki url'yi geçtiğimde Phil's route debugger kullanıyor ve kullanıyor, yol hata ayıklayıcısı kimliği 12345 olarak gösteriyor.

Denetleyicim, int bir abone kimliği kabul ediyor. Ne zaman ateş ederse, denetleyici hatasını atar "Parametreler sözlüğü, null olmayan" System.Int32 "" id "parametresi için boş bir giriş içerir. Rota hata ayıklayıcısı neden bir değer gösterir ve denetleyici bunu görmüyor?

İşte

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

ben ShowAll eylem bir null alıyorum neden herhangi bir fikir (ilki suçlu) benim rota mı?

public ActionResult ShowAll(int id) 
+0

Eğer eylem yöntemi imzası ile allong tüm rota kayıtlarını gönderebilir miyim? –

+0

Evet. Soru güncellendi. –

+0

Sanırım sorun senin kısıtınla. Ben bir regex ninja değilim, o yüzden sana yardım edemem. –

cevap

5

denetleyici yöntemi imza MVC ne bilmiyor gibi bir dize kabul etmek gerektiğini Bulunan var yani varsayılan listesinden id kaldırmayı deneyin: İşte eylem yöntemi imzadır Geçirilen parametreyi yazın ve bu nedenle int'ye gönderemezsiniz, ancak kısıtlama yoluyla zorlayabilir.

routes.MapRoute ( "SubscriberAll", "abone/{id}", yeni {controller = "Abone", aksiyon =:

Yani, ile sona erdi rota şudur "ShowAll"}, yeni {id = @ "\ d +"} // sayısal onaylayın);

ve ben ile sona erdi kontrolör yöntemi imza Hattın yazma "id = 0" yerine yazı bu

public ActionResult ShowAll(string id) 
+2

Bu doğru değil; Aslında, MVC, int için url içinde ilettiğiniz dizeleri ayrıştırmaya çalışır. Public ActionResult ShowAll (string id) + new {controller = "Home", action = "Index", id = UrlParameter.Optional}, int parametresi int türündeyken ve id olarak adlandırıldıkça, personId gibi başka bir şey kullanılmamalıdır. – usefulBee

+1

@usefulBee: _'yazmak için teşekkürler "ve kimliği, personId gibi başka bir şey yok" _, sadece bu hatayı kodumda yaptığımı fark ettim ve şimdi bir aptal gibi hissediyorum, ama benim sorunum çözüldü! : D Teşekkürler.Bence bunu ayrı bir cevap olarak göndermelisin (benden en azından bir not alırsın). – Sk8erPeter

+1

Omg, parametre ismini yanlışlıkla daha spesifik olana değiştirdim ve bu yönlendirme kırdı. –

1

sadece

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

Hala hatayı alıyorum. ID'nin istenmesini istiyorum. –

+0

@ asp316 benim yanıtım güncellendi – Vadim

1

olduğunu "id = UrlParameter.Optional"

bu kesinlikle olur eylem sonucu ile çalışmak

public ActionResult ShowAll(int id) 

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