จะสร้าง ASP.NET Web API Url ได้อย่างไร?


คำตอบ:


139

ApiControllerมีคุณสมบัติที่เรียกว่าUrlซึ่งเป็นประเภทSystem.Web.Http.Routing.UrlHelperซึ่งช่วยให้คุณสร้าง URL ที่สำหรับตัวควบคุม API

ตัวอย่าง:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

UrlHelper นี้ไม่มีอยู่ทั้งในมุมมองของคุณหรือในตัวควบคุมมาตรฐาน


UPDATE:

และในการกำหนดเส้นทางภายนอก ApiController คุณสามารถทำสิ่งต่อไปนี้:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

หรือภายในมุมมอง:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

สังเกตhttproute = ""เส้นทางโทเค็นซึ่งมีความสำคัญ

เห็นได้ชัดว่านี่ถือว่าเส้นทาง Api ของคุณถูกเรียกDefaultApiในเมธอด RegisterRoutes ของคุณในGlobal.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

นั่น .. ไม่ได้ช่วยอะไรฉันมากนักเพราะฉันต้องการ View ของฉันเพื่อที่จะสร้าง URL ได้อย่างปลอดภัย หากมีใบอนุญาต Go Live วิธี 'Go Live' ในการสร้าง URL บน View คืออะไร?
Shane Courtrille

ที่สำคัญกว่านี้จะใช้ไม่ได้หากคุณใช้ ASP.Net Development Server เนื่องจากมีการเปลี่ยนแปลงพอร์ตตลอดเวลาดังนั้นคุณจึงไม่สามารถฮาร์ดคอร์ url ในมุมมองได้
Shane Courtrille

@ShaneCourtrille ฉันได้อัปเดตคำตอบเพื่อแสดงให้เห็นว่าคุณสามารถใช้เส้นทางปกติSystem.Web.Mvc.UrlHelperในการสร้างเส้นทาง Api นอก HttpControllerContext ได้อย่างไร
Darin Dimitrov

ขอบคุณมาก ๆ! ฉันพยายามใช้ RouteUrl แต่ไม่ทราบเกี่ยวกับข้อกำหนดพารามิเตอร์ HTTproute
Shane Courtrille

2
ฉันเข้าใจจุดประสงค์ของตัวอย่าง ฉันกำลังบอกว่ามันจะเป็นตัวอย่างที่มีประโยชน์มากขึ้นหากคุณโยนโค้ด ViewBag หนึ่งบรรทัดเพราะคุณจะแสดงให้เห็นว่าค่านี้เป็นสิ่งที่เราพยายามจะได้รับในสถานการณ์ที่เป็นไปได้และไม่ใช่แค่การเรียกใช้โค้ดตามอำเภอใจ อีกครั้งฉันจะไม่แสดงความคิดเห็นถ้าฉันไม่เสียเวลาสักสองสามนาทีโดยไม่ได้ตระหนักถึงสิ่งที่ฉันพลาดไปก่อนที่ฉันจะจำได้ว่าบรรทัดของรหัสนั้นเป็นรหัสที่เกี่ยวข้อง
Jon Davis

43

ใช้งานได้กับรูปแบบที่ง่ายกว่าUrl.Actionดังนั้นคุณไม่ต้องอ้างอิงชื่อเส้นทางใด ๆ :

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

คุณอาจต้องการเพิ่มarea = ""หากจำเป็นต้องใช้ URL ภายในพื้นที่ (ตัวควบคุม Api อยู่นอกพื้นที่โดยค่าเริ่มต้น) ฉันใช้ MVC 4


7
UrlHelper ใน Web Api คือmsdn.microsoft.com/en-us/library/…แต่ไม่มีวิธีการดำเนินการ
Yuriy Faktorovich

8
@YuriyFaktorovich โพสต์นี้บอกเป็นนัยว่าUrl.Actionถูกใช้จาก View Urlเป็นประเภทSystem.Web.Mvc.UrlHelperและไม่ได้จับคู่กับWebApiเส้นทาง new { httproute = "" }นี่คือเหตุผลที่คุณต้องการพารามิเตอร์พิเศษ:
Jesse

3
ฉันได้เพิ่มhttproute""แต่มันไม่ได้ทำแผนที่ = /
Maslow

ฉันต้องเพิ่มลิงค์ด้วยพื้นที่ว่างและ htmlAttributes ว่าง@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) แต่มันทำงานได้อย่างสมบูรณ์
Christopher G. Lewis

2
สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบจากมุมมองอย่างไรก็ตามฉันไม่แน่ใจว่าเหตุใดจึงสร้างชื่อของการกระทำเป็นสตริงข้อความค้นหาเช่น: / api / dashboard? action = getdata ฉันคาดหวังสิ่งนี้: / api / dashboard / getdata
umutesen

7

ต้องการสร้างลิงก์ในลักษณะ typesafe โดยไม่ต้องใช้สตริงฮาร์ดโค้ด (ชื่อคอนโทรลเลอร์)

มีสิ่งที่น่าสนใจสำหรับสิ่งนั้น! (และเขียนโดย Mark Seeman)

https://github.com/ploeh/Hyprlinkr

ทำงานเช่นนี้:

เส้นทางตามปกติ:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

รับ URL:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

ผลลัพธ์:

http://localhost/api/foo/1337

3

นี่คือวิธี KISS ในการตอบคำถาม:

หากนี่คือรหัสที่คุณจะใช้สร้าง URL ตัวควบคุม MVC

@Url.Action("Edit", "MyController")

ในการรับ URL สำหรับคอนโทรลเลอร์เวอร์ชัน API (สมมติว่าคุณใช้ชื่อคอนโทรลเลอร์เดียวกัน) คุณสามารถใช้ได้

@Url.Action("Edit", "api/MyController")

เมธอด Url.Action ทั้งหมดกำลังทำคือการต่อท้ายรูทพา ธ ของแอ็พพลิเคชันโดยมีชื่อคอนโทรลเลอร์ตามด้วยชื่อแอ็คชัน (เว้นแต่จะเป็น "ดัชนี" ซึ่งในกรณีนี้จะไม่มีการต่อท้ายหากอ็อบเจ็กต์ค่าเส้นทางมี id คุณสมบัติค่านี้จะต่อท้าย URL ด้วย


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