ใน ASP.NET MVC เรามี@Url.Action
ไว้สำหรับการดำเนินการ มีสิ่งที่คล้ายกันเช่น@Url.Api
ที่จะกำหนดเส้นทางไปยัง / api / controller หรือไม่?
ใน ASP.NET MVC เรามี@Url.Action
ไว้สำหรับการดำเนินการ มีสิ่งที่คล้ายกันเช่น@Url.Api
ที่จะกำหนดเส้นทางไปยัง / api / controller หรือไม่?
คำตอบ:
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 }
);
System.Web.Mvc.UrlHelper
ในการสร้างเส้นทาง Api นอก HttpControllerContext ได้อย่างไร
ใช้งานได้กับรูปแบบที่ง่ายกว่าUrl.Action
ดังนั้นคุณไม่ต้องอ้างอิงชื่อเส้นทางใด ๆ :
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
คุณอาจต้องการเพิ่มarea = ""
หากจำเป็นต้องใช้ URL ภายในพื้นที่ (ตัวควบคุม Api อยู่นอกพื้นที่โดยค่าเริ่มต้น) ฉันใช้ MVC 4
Url.Action
ถูกใช้จาก View Url
เป็นประเภทSystem.Web.Mvc.UrlHelper
และไม่ได้จับคู่กับWebApi
เส้นทาง new { httproute = "" }
นี่คือเหตุผลที่คุณต้องการพารามิเตอร์พิเศษ:
httproute""
แต่มันไม่ได้ทำแผนที่ = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
แต่มันทำงานได้อย่างสมบูรณ์
ต้องการสร้างลิงก์ในลักษณะ 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
นี่คือวิธี KISS ในการตอบคำถาม:
หากนี่คือรหัสที่คุณจะใช้สร้าง URL ตัวควบคุม MVC
@Url.Action("Edit", "MyController")
ในการรับ URL สำหรับคอนโทรลเลอร์เวอร์ชัน API (สมมติว่าคุณใช้ชื่อคอนโทรลเลอร์เดียวกัน) คุณสามารถใช้ได้
@Url.Action("Edit", "api/MyController")
เมธอด Url.Action ทั้งหมดกำลังทำคือการต่อท้ายรูทพา ธ ของแอ็พพลิเคชันโดยมีชื่อคอนโทรลเลอร์ตามด้วยชื่อแอ็คชัน (เว้นแต่จะเป็น "ดัชนี" ซึ่งในกรณีนี้จะไม่มีการต่อท้ายหากอ็อบเจ็กต์ค่าเส้นทางมี id คุณสมบัติค่านี้จะต่อท้าย URL ด้วย
api/
ก่อนชื่อคอนโทรลเลอร์