2013-06-03 45 views
5

Tôi cố gắng để thiết lập định tuyến tùy chỉnh với các tuyến đường ánh xạ sauasp.net-mvc vấn đề định tuyến: Từ điển thông số chứa một mục null cho tham số

chỉnh sửa: đầy đủ lộ trình cấu hình của tôi

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     #region FixtureAdmin 

     routes.MapRoute(
      name: "FixtureEdit", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "FixtureAdmin", action = "Edit", id = UrlParameter.Optional } 
     ); 

     #endregion 

     #region Results 

     routes.MapRoute(
      name: "ResultAdd", 
      url: "{controller}/{action}/{fixtureId}", 
      defaults: new { controller = "Result", action = "Add", fixtureId = UrlParameter.Optional } 
     ); 

     #endregion 

Và mã điều khiển của tôi

public ActionResult Add(int fixtureId) 
    { 
     // return model to view etc.. 
    } 

Điều này xảy ra với ngoại lệ, mặc dù tôi đã chỉ định tham số là tùy chọn.

Từ điển thông số chứa một mục null cho tham số 'fixtureId'

Điều kỳ lạ là, nếu tôi thay đổi các tham số của Add hành động để chỉ 'Id' thì URL sau đây sẽ làm việc Kết quả/Thêm/1. Tôi đang bối rối, có một số định tuyến mặc định đó là trọng của một tùy chỉnh của tôi? Tại sao thay đổi tham số thành công việc 'Id'?

Sửa

Chỉ cần để kiểm tra, tôi đã thêm tham số khác để hành động

public ActionResult Add(int? fixtureId, int? testId) 

sau đó tôi thay đổi nội dung các tuyến đường phù hợp và bây giờ nó hoạt động, vì vậy tôi nghĩ đó là một vấn đề với định tuyến mặc định .

+0

được bất cứ đường nào khác của họ cũng được cấu hình trước hoặc sau này – rajansoft1

+1

Nếu bạn muốn để có thể gọi 'Thêm' mà không chỉ định id,' fixtureId' phải là nullable - 'int? fixtureId'. "Tùy chọn" trong ngữ cảnh của tuyến đường có nghĩa là nó không phải nằm trong URL, để bạn có thể có các hành động như 'public ActionResult Add() {/ * no parameters * /}' – Alex

+0

Điều duy nhất tôi có thể nghĩ đến là bạn đang sử dụng một int là không nullable? Id có thể được đưa vào framework MVC để có thể hoạt động khác nhau. – David

Trả lời

6

Sử dụng hàm int có thể vô hiệu trong Hành động điều khiển của bạn.

public ActionResult Add(int? fixtureId) 
{ 
    // return model to view etc.. 
} 

Nhưng câu hỏi đặt ra là, nếu đó thực sự là ID, nó sẽ phản ứng như thế nào nếu người dùng yêu cầu ID rỗng/trống? ID đó có phải là chìa khóa trong DB của bạn không? Bạn có thể làm cho nó nullable nếu bạn có thể xử lý hoặc cung cấp một trang mặc định nếu ID là trống/null.

EDIT:

Điều này là do ASP.NET sẽ cho rằng một tham số không xác định trong yêu cầu của bạn là id, trong trường hợp của bạn, Results/Add/1, 1 là không xác định. Nếu bạn muốn làm cho mã đó hoạt động với việc sử dụng fixtureId, bạn nên sử dụng Results/Add?fixureId=1. Vì vậy, cuối cùng, nó không phải vì định tuyến, nhưng thay vào đó, đó là vì các tham số trong hành động mà bạn có.

EDIT2:

Ngoài ra, những gì bạn đang trải qua có được gọi là một cuộc xung đột định tuyến. Tuyến đường của bạn đang xung đột với Default. Bạn có thể thử áp dụng constraints.

+0

Tôi có thể làm cho nó nullable và xử lý nó cho phù hợp. Vấn đề là khi tôi thực sự chuyển một giá trị vào với Result/Add/1, ví dụ giá trị được truyền vào luôn luôn là null. – nik0lias

+0

xem bản chỉnh sửa của tôi. – aiapatag

+1

Ok, có vẻ như vậy là đủ, tôi muốn ẩn các thông số từ người dùng nếu có thể nhưng có thể phải làm điều đó bằng cách đăng biểu mẫu, cảm ơn. – nik0lias

1

Hãy xem phương pháp này để thêm những gì nhà phát triển gọi là 'NullableConstraint' clicky link Vì vậy, nếu thông số tùy chọn được cung cấp, bạn có thể thực hiện kiểm tra giá trị của nó.

Và cũng xem xét câu trả lời sau câu trả lời được chấp nhận cho những gì có vẻ là giải pháp đơn giản hơn, sạch hơn.

2

2, từ bài viết của bạn tôi nghĩ rằng vấn đề của bạn là đưa tuyến đường tùy chỉnh của bạn sau khi mặc định, như thế này:

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

     routes.MapRoute(
     name: "ResultAdd", 
     url: "{controller}/{action}/{fixtureId}", 
     defaults: new { controller = "Home", action = "Add", fixtureId = UrlParameter.Optional } 

vậy: 1/ngoại lệ "Từ điển thông số chứa một mục null cho tham số 'fixtureId '' sẽ đến nếu bạn không cung cấp tên tuyến đường cụ thể cho bất kỳ liên kết hành động hoặc biểu mẫu tuyến đường nào vì MVC sẽ sử dụng tuyến đường mặc định để định tuyến. Vì vậy, bạn cần phải cung cấp tên đường cụ thể để định tuyến tùy chỉnh của bạn có thể làm việc, như thế này:

@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd") 

Cheer