2011-01-12 27 views
5

Trước hết, tôi mới tham gia MVC, vì vậy hãy giải thích câu hỏi nếu nó là cơ bản.Nhận giá trị tham số null trong bộ điều khiển khi tuyến đường MVC kích hoạt

Tôi đang sử dụng tuyến đường tùy chỉnh để tạo URL sau (http: // mysite/subscriber/12345) trong đó 12345 là số người đăng ký. Tôi muốn nó chạy hành động Show2 ShowAll trong bộ điều khiển Người đăng ký. Tuyến đường của tôi đang kích hoạt và sử dụng Phil's route debugger, khi tôi chuyển vào url ở trên, trình gỡ lỗi tuyến đường hiển thị ID là 12345.

Bộ điều khiển của tôi đang chấp nhận int làm người đăng ký. Khi nó cháy, bộ điều khiển ném lỗi "Từ điển tham số chứa một mục nhập rỗng cho tham số 'id' của loại không có giá trị 'System.Int32". Tại sao trình gỡ rối tuyến đường hiển thị một giá trị và bộ điều khiển không nhìn thấy nó?

Dưới đây là tuyến đường của tôi (người đầu tiên là thủ phạm)

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

Bất cứ ý tưởng tại sao tôi nhận được một null trong hành động ShowAll? Dưới đây là phương pháp hành động chữ ký:

public ActionResult ShowAll(int id) 
+0

Bạn có thể đăng tất cả đăng ký tuyến đường bằng chữ ký phương thức hành động không? –

+0

Có. Đã cập nhật câu hỏi. –

+0

Tôi nghĩ vấn đề là do sự ràng buộc của bạn. Tôi không phải là một ninja regex mặc dù vậy tôi không thể giúp bạn ở đó. –

Trả lời

5

Tìm thấy rằng chữ ký phương pháp điều khiển cần phải chấp nhận một chuỗi như MVC không biết những gì gõ tham số đi qua và do đó không thể truyền nó vào int, nhưng nó có thể thực thi nó thông qua ràng buộc.

Vì vậy, con đường tôi đã kết thúc với là thế này:

routes.MapRoute ( "SubscriberAll", "thuê bao/{id}", mới {controller = "thuê bao", action = "ShowAll"}, mới {id = @ "\ d +"} // xác nhận số );

và chữ ký phương pháp điều khiển tôi đã kết thúc với là này

public ActionResult ShowAll(string id) 
+2

Điều đó không chính xác; trên thực tế, MVC cố gắng phân tích cú pháp chuỗi nào bạn chuyển trong url thành int. Sử dụng ActionResult ShowAll công cộng (string id) + new {controller = "Home", action = "Index", id = UrlParameter.Optional} nên làm việc miễn là tham số id là kiểu int và được gọi là id, không có gì khác như personId. – usefulBee

+1

@usefulBee: cảm ơn viết _ "và được gọi là id, không có gì khác như personId" _, tôi vừa nhận ra rằng tôi đã mắc lỗi này trong mã của tôi, và bây giờ tôi cảm thấy như một thằng ngốc, nhưng vấn đề của tôi được giải quyết! : D Cảm ơn.Tôi nghĩ rằng bạn nên đăng nó như là một câu trả lời riêng biệt (bạn ít nhất cũng có được một upvote từ tôi). – Sk8erPeter

+1

Omg, tôi đã vô tình thay đổi tên tham số từ id thành id cụ thể hơn và định tuyến đã hỏng. –

1

Hãy thử loại bỏ id từ danh sách các giá trị mặc định tức là chỉ có

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

Vẫn gặp lỗi. Tôi muốn ID được yêu cầu. –

+0

@ asp316 cập nhật câu trả lời của tôi – Vadim

1

Thay vì viết "id = 0" trong MapRoute viết của bạn "id = UrlParameter.Optional"

sẽ điều này chắc chắn làm việc với kết quả hành động của bạn

public ActionResult ShowAll(int id) 

routes.MapRoute(
        "SubscriberAll", 
        "subscriber/{id}", 
        new { controller = "Subscriber", action = "ShowAll", id = UrlParameter.Optional }, 
        new { id = @"\d+" } //confirm numeric 
       ); 
Các vấn đề liên quan