Định tuyến với nhiều tham số bằng ASP.NET MVC


139

Công ty chúng tôi đang phát triển API cho các sản phẩm của mình và chúng tôi đang nghĩ về việc sử dụng ASP.NET MVC. Khi thiết kế API của chúng tôi, chúng tôi đã quyết định sử dụng các cuộc gọi như cuộc gọi dưới đây để người dùng yêu cầu thông tin từ API ở định dạng XML:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

Như bạn có thể thấy, nhiều tham số được truyền (tức là artistapi_key). Trong ASP.NET MVC, artistsẽ là controller, getImageshành động, nhưng làm thế nào tôi sẽ vượt qua nhiều tham số để hành động?

Điều này thậm chí có thể sử dụng định dạng trên?

Câu trả lời:


279

Các tham số được hỗ trợ trực tiếp trong MVC bằng cách thêm các tham số vào các phương thức hành động của bạn. Đưa ra một hành động như sau:

public ActionResult GetImages(string artistName, string apiKey)

MVC sẽ tự động điền các tham số khi được cung cấp một URL như:

/Artist/GetImages/?artistName=cher&apiKey=XXX

Một trường hợp đặc biệt bổ sung là các tham số có tên "id". Bất kỳ tham số có tên ID nào cũng có thể được đưa vào đường dẫn thay vì chuỗi truy vấn, vì vậy đại loại như:

public ActionResult GetImages(string id, string apiKey)

sẽ được điền chính xác với một URL như sau:

/Artist/GetImages/cher?apiKey=XXX

Ngoài ra, nếu bạn có các kịch bản phức tạp hơn, bạn có thể tùy chỉnh các quy tắc định tuyến mà MVC sử dụng để định vị một hành động. Tệp global.asax của bạn chứa các quy tắc định tuyến có thể được tùy chỉnh. Theo mặc định, quy tắc trông như thế này:

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

Nếu bạn muốn hỗ trợ một url như

/Artist/GetImages/cher/api-key

bạn có thể thêm một tuyến đường như:

routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

và một phương thức như ví dụ đầu tiên ở trên.


1
Tôi đang làm việc với .NET 4 và MVC. Tôi chỉ có thể vượt qua một tham số trong đường dẫn. URL này {bộ điều khiển} / {hành động} / {artistName} / {apikey} không ánh xạ tới 2 tham số cho tôi mà chỉ gây ra lỗi 404. Theo như tôi có thể nói với bạn chỉ có thể truyền 1 tham số trong đường dẫn. Tôi đang làm gì sai?
DavidHyogo

1
@DavidHyogo - Tôi đã gặp vấn đề tương tự. Vì bất kỳ lý do gì, mặc dù tôi đã chỉ định hành động mặc định, tôi thực sự phải đặt hành động tôi muốn trong liên kết html của mình, không chỉ bộ điều khiển và tham số.
Shaggy13spe

5
@DavidHyogo: Tôi gặp vấn đề tương tự và phát hiện ra rằng các tham số mẫu tuyến đường của bạn phải khớp chính xác với tên tham số của phương thức hành động, ví dụ: đối với tuyến được xác định là {controller} / {action} / {artistName} / {apikey}, phương thức hành động phải có chữ ký công khai ActionResult MyMethod (chuỗi artistName, chuỗi apikey)
Sudhanshu Mishra

6
Ngoài ra, hãy đảm bảo URL của bạn không bị bắt bởi tuyến đường mặc định trước khi đến được tùy chỉnh của bạn. Nó sẽ sử dụng trận đấu đầu tiên dựa trên cách bạn xác định chúng. Trong trường hợp của tôi, tôi đã cố gắng sử dụng tuyến đường "MyContoder / {year} / {tháng}" cho mặc định của Index, nhưng tuyến đường {bộ điều khiển} / {hành động} / {id} phù hợp với URL của tôi (MyContoder / 2015 / 04), vì vậy tôi đã nhận được 404 vì không có hành động nào với tên 2015 tồn tại. Di chuyển tuyến tùy chỉnh của tôi lên đầu đã khắc phục vấn đề.
Sam

Tên tham số trong routeconfig không phù hợp với chữ ký hành động của tôi, đó là lý do tại sao nó không được làm việc, tôi làm theo các bước được mô tả bởi @dotnetguy và nó làm việc
pepitomb

26

Bắt đầu với MVC 5, bạn cũng có thể sử dụng Định tuyến thuộc tính để di chuyển cấu hình tham số URL sang bộ điều khiển của mình.

Một cuộc thảo luận chi tiết có sẵn tại đây: http://bloss.msdn.com/b/webdev/archive/2013/10/17/attribution-routing-in-asp-net-mvc-5.aspx

Tóm lược:

Đầu tiên bạn kích hoạt định tuyến thuộc tính

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

Sau đó, bạn có thể sử dụng các thuộc tính để xác định tham số và các loại dữ liệu tùy chọn

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)

5
Định tuyến thuộc tính trong ASP.NET Core MVC được mô tả tại docs.microsoft.com/en-us/aspnet/core/mvc/controllers/ Kẻ
Bernard Vander Beken

21

Bạn có thể chuyển các tham số tùy ý thông qua chuỗi truy vấn, nhưng bạn cũng có thể thiết lập các tuyến tùy chỉnh để xử lý nó theo cách RESTful:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

Đó có thể là:

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

Vì vậy, nếu ai đó sử dụng tuyến đường sau:

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

Nó sẽ đưa họ đến cùng một nơi mà chuỗi truy vấn mẫu của bạn đã làm.

Trên đây chỉ là một ví dụ và không áp dụng các quy tắc và ràng buộc kinh doanh mà bạn phải thiết lập để đảm bảo mọi người không 'hack' URL.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.