2012-04-20 38 views
5

Khi bạn thao tác dữ liệu trong một hành động, bạn thường nhận được ID làm thông số, nhưng bạn cần thực hiện một số xử lý lỗi cho id đó. Một trong những lỗi xử lý bạn phải làm cho mọi hành động là đảm bảo ID cao hơn 0 (không phải là số âm). Vì vậy, thay vì xử lý điều này trong hành động, tôi muốn thêm một ràng buộc tuyến đường vì vậy chỉ không định tuyến đến hành động nếu một id âm của nó.Lỗi ràng buộc tuyến đường trên POST

Dưới đây là mã của tôi:

//route definition 
     routes.MapRoute(
      "default route" , 
      "{controller}/{action}/{id}" , 
      new { id = UrlParameter.Optional }, 
      new { id = @"^\d+$" } 
     ); 

//action definition (note I also tried with only [HttpPost] and with nothing same result 
     [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
     public ActionResult Edit(int id) 

Tất cả đều hoạt động tốt khi bạn làm một GET trên hành động, nhưng khi tôi POST tôi nhận được lỗi sau khi nó chỉ cần đi đến trang 404

HTTP verb POST used to access path '/object/edit/-2' is not allowed. 

[HttpException (0x80004005): The HTTP verb POST used to access path '/object/edit/-2' is not allowed.] 
    System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +740 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +632 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194 

Bất kỳ ý tưởng nào? Có lẽ một giải pháp tốt hơn?

EDIT: Chỉ cần nhận thấy một cái gì đó thú vị, ban đầu tôi nghĩ rằng các thông báo lỗi là 500, nhưng nó là một 405 mà là "không tìm thấy phương pháp"

+0

bạn có đang viết lại URL nào không? Các đường dẫn trong ngoại lệ của bạn không khớp. – Robaticus

+0

không xin lỗi, tôi đã đề cập trong câu trả lời đầu tiên, tôi có nghĩa là để thay thế các hành động và điều khiển trong cả hai nhưng bỏ lỡ sự xuất hiện thứ hai. Cả hai đều phù hợp. –

+0

Tôi thực sự không hiểu tại sao nó sẽ được tốt trên GET và ném một lỗi trên POST –

Trả lời

1

Bạn nói:

HTTP động từ POST sử dụng để truy cập đường dẫn '/ object/edit/-2' không được phép.

Tuy nhiên các quốc gia ngoại lệ:

Các HTTP POST động từ dùng để truy cập path '/ profile/EDITLINK/-2' không được phép.

Edit:

Tôi nghĩ rằng điều này có thể liên quan đến vấn đề của bạn.

Tuy nhiên, đó không phải là trạng thái của bạn.

+0

có xin lỗi, tôi sao chép lỗi nhưng tôi có nghĩa là để thay thế cả hai, nhưng bỏ lỡ sự xuất hiện thứ hai, xấu của tôi. –

+3

Bạn có thể [sửa] để biến câu trả lời này thành câu trả lời thay vì câu hỏi không? – Will

0

Cố gắng loại bỏ

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 

Và xem nếu nó chỉ hoạt động (thường là bạn sẽ đặt [HttpPost] để từ chối HttpGet vv).

+0

bạn nói đúng, mặc dù tôi vừa thêm tuyên bố này cho mục đích thử nghiệm. –

1

Tôi khuyên bạn nên cài đặt trình gỡ lỗi định tuyến được tìm thấy here. Nó sẽ cho bạn biết chính xác cách một URL cụ thể đang được phân tích cú pháp theo từng tuyến đường, vì vậy bạn có thể xem điều gì thực sự xảy ra khi bạn nhấn URL đó. Nếu tuyến đường của bạn bị bỏ qua, thì bạn biết ràng buộc của mình đang hoạt động, và bạn có thể tập trung vào bất cứ thứ gì đang bắt được nó. Nếu tuyến đường của bạn bị trúng, thì đó là vấn đề với hành động và/hoặc động từ mà nó cần.

Lưu ý bên: Tôi hoàn toàn không thể tải phiên bản 2.0.0.7 của trình gỡ lỗi này hoạt động chính xác (vào tháng 8), nhưng phiên bản được liên kết trực tiếp trong bài viết (hoặc phiên bản 1.0.0.1 trên NuGet) hoạt động tốt. Tôi cho rằng phiên bản hiện tại trong NuGet đang hoạt động, nhưng nếu không, hãy thử phiên bản cũ hơn.

+0

sẽ cố gắng cảm ơn bạn. –

Các vấn đề liên quan