การกำหนดเส้นทางด้วยพารามิเตอร์หลายรายการโดยใช้ ASP.NET MVC


139

บริษัท ของเรากำลังพัฒนา API สำหรับผลิตภัณฑ์ของเราและเรากำลังคิดที่จะใช้ ASP.NET MVC ในขณะที่ออกแบบ API ของเราเราตัดสินใจที่จะใช้การโทรเหมือนที่ด้านล่างสำหรับผู้ใช้เพื่อขอข้อมูลจาก API ในรูปแบบ XML:

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

อย่างที่คุณเห็นมีการส่งพารามิเตอร์หลายตัว (เช่นartistและapi_key) ใน ASP.NET MVC, artistจะเป็นcontroller, getImagesการดำเนินการ แต่วิธีการที่ฉันจะผ่านหลายพารามิเตอร์ให้ดำเนินการได้หรือไม่

สิ่งนี้เป็นไปได้หรือไม่หากใช้รูปแบบด้านบน

คำตอบ:


279

พารามิเตอร์ได้รับการสนับสนุนโดยตรงใน MVC เพียงแค่เพิ่มพารามิเตอร์ลงในวิธีการกระทำของคุณ ได้รับการดำเนินการดังนี้:

public ActionResult GetImages(string artistName, string apiKey)

MVC จะเติมพารามิเตอร์อัตโนมัติเมื่อได้รับ URL เช่น:

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

อีกหนึ่งกรณีพิเศษคือพารามิเตอร์ชื่อ "id" ID ใด ๆ ที่มีชื่อว่า ID สามารถใส่ลงในพา ธ แทนที่จะเป็นเคียวรีสตริงได้ดังนั้น:

public ActionResult GetImages(string id, string apiKey)

จะมีการเติมข้อมูลอย่างถูกต้องด้วย URL ดังนี้:

/Artist/GetImages/cher?apiKey=XXX

นอกจากนี้หากคุณมีสถานการณ์ที่ซับซ้อนมากขึ้นคุณสามารถกำหนดกฎการกำหนดเส้นทางที่ MVC ใช้เพื่อค้นหาการกระทำ ไฟล์ global.asax ของคุณมีกฎการกำหนดเส้นทางที่สามารถปรับแต่งได้ โดยค่าเริ่มต้นกฎมีลักษณะดังนี้:

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

หากคุณต้องการสนับสนุน URL เช่น

/Artist/GetImages/cher/api-key

คุณสามารถเพิ่มเส้นทางเช่น:

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

และวิธีการเช่นตัวอย่างแรกข้างต้น


1
ฉันทำงานกับ. NET 4 และ MVC ฉันสามารถส่งผ่านพารามิเตอร์เดียวเท่านั้นในเส้นทาง URL {controller} / {action} / {artistName} / {apikey} นี้ไม่ได้จับคู่กับพารามิเตอร์ 2 ตัวสำหรับฉัน แต่เพียงเรียกใช้ข้อผิดพลาด 404 เท่าที่ฉันสามารถบอกได้ว่าคุณสามารถผ่าน 1 พารามิเตอร์ในเส้นทางเท่านั้น ผมทำอะไรผิดหรือเปล่า?
DavidHyogo

1
@DavidHyogo - ฉันประสบปัญหาเดียวกัน ไม่ว่าจะด้วยเหตุผลใดก็ตามถึงแม้ว่าฉันจะระบุการกระทำเริ่มต้น แต่ฉันต้องใส่การกระทำที่ฉันต้องการในลิงก์ html ของฉันไม่ใช่เฉพาะคอนโทรลเลอร์และพารามิเตอร์
Shaggy13spe

5
@DavidHyogo: ฉันมีปัญหาเดียวกันและพบว่าพารามิเตอร์แม่แบบเส้นทางของคุณจะต้องตรงกับชื่อพารามิเตอร์วิธีการกระทำเช่นสำหรับเส้นทางที่กำหนดเป็น {controller} / {action} / {artistName} / {apikey} วิธีการดำเนินการควรมีลายเซ็น สาธารณะ ActionResult MyMethod (ชื่อศิลปินสตริง apikey สตริง)
Sudhanshu Mishra

6
นอกจากนี้ตรวจสอบให้แน่ใจว่า URL ของคุณไม่ได้ถูกดักจับโดยเส้นทางเริ่มต้นก่อนที่จะถึง URL ที่คุณกำหนดเอง จะใช้การจับคู่แรกตามวิธีที่คุณกำหนดไว้ ในกรณีของฉันฉันพยายามใช้เส้นทาง "MyController / {ปี} / {เดือน}" สำหรับค่าเริ่มต้นของดัชนี แต่เส้นทาง {controller} / {action} / {id} ตรงกับ URL ของฉัน (MyController / 2015 / 04) ดังนั้นฉันได้รับ 404 เพราะไม่มีการกระทำที่มีชื่อในปี 2015 การย้ายเส้นทางที่กำหนดเองไปยังด้านบนช่วยแก้ไขปัญหาได้
แซม

ชื่อพารามิเตอร์ใน routeconfig ไม่ตรงกับลายเซ็น Action ของฉันนั่นเป็นสาเหตุที่มันไม่ทำงานฉันทำตามขั้นตอนที่อธิบายโดย @dotnetguy และทำงานได้
pepitomb

26

เริ่มต้นด้วย MVC 5 คุณยังสามารถใช้การกำหนดเส้นทางแอตทริบิวต์เพื่อย้ายการกำหนดค่าพารามิเตอร์ URL ไปยังตัวควบคุมของคุณ

การสนทนาอย่างละเอียดมีอยู่ที่นี่: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

สรุป:

ขั้นแรกให้คุณเปิดใช้งานการกำหนดเส้นทางแอตทริบิวต์

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

         routes.MapMvcAttributeRoutes();
     } 
 }

จากนั้นคุณสามารถใช้แอตทริบิวต์เพื่อกำหนดพารามิเตอร์และชนิดข้อมูลแบบเลือกได้

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

5
การกำหนดเส้นทางแอตทริบิวต์ใน ASP.NET Core MVC มีการอธิบายไว้ที่docs.microsoft.com/en-us/aspnet/core/mvc/controllers/ …
Bernard Vander Beken

21

คุณสามารถส่งพารามิเตอร์ที่กำหนดเองผ่านสตริงการสืบค้น แต่คุณยังสามารถตั้งค่าเส้นทางที่กำหนดเองเพื่อจัดการกับมันในลักษณะที่สงบ:

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

นั่นอาจเป็น:

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

ดังนั้นหากมีคนใช้เส้นทางต่อไปนี้:

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

มันจะพาพวกเขาไปยังสถานที่เดียวกันซึ่งเป็นตัวอย่างการสืบค้นของคุณ

ตัวอย่างข้างต้นเป็นเพียงตัวอย่างและไม่ใช้กฎและข้อ จำกัด ทางธุรกิจที่คุณต้องตั้งค่าเพื่อให้แน่ใจว่าผู้คนไม่ได้ 'แฮ็ค' URL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.