Di ASP.NET MVC, kami memiliki @Url.Actiontindakan. Apakah ada sesuatu yang serupa seperti @Url.Apiyang akan diarahkan ke / api / controller?
Di ASP.NET MVC, kami memiliki @Url.Actiontindakan. Apakah ada sesuatu yang serupa seperti @Url.Apiyang akan diarahkan ke / api / controller?
Jawaban:
The ApiController memiliki sifat yang disebut Url yang tipe System.Web.Http.Routing.UrlHelper yang memungkinkan Anda untuk membangun url untuk pengendali api.
Contoh:
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 ini tidak ada di tampilan Anda maupun di pengontrol standar.
MEMPERBARUI:
Dan untuk melakukan perutean di luar ApiController Anda dapat melakukan hal berikut:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
atau di dalam tampilan:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Perhatikan httproute = ""token rute mana yang penting.
Jelas ini mengasumsikan bahwa rute Api Anda dipanggil DefaultApidalam metode RegisterRoutes Anda di Global.asax:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelperuntuk menghasilkan rute Api di luar HttpControllerContext.
Ini bekerja dengan bentuk yang lebih sederhana Url.Actionsehingga Anda tidak perlu merujuk nama Perutean apa pun:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Anda mungkin ingin menambahkan area = ""jika URL dibutuhkan dalam suatu Area. (Pengontrol api berada di luar Area secara default.) Saya menggunakan MVC 4.
Url.Actionsedang digunakan dari View. Urladalah tipe System.Web.Mvc.UrlHelper, dan tidak memetakan ke WebApirute. Inilah sebabnya mengapa Anda memerlukan parameter tambahan: new { httproute = "" }.
httproute""tetapi tidak memetakan = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) tetapi itu bekerja dengan sempurna
Ingin dapat membuat tautan dengan cara yang aman, tanpa string hardcode (nama pengontrol)?
Ada nuget untuk itu! (dan itu ditulis oleh Mark Seeman)
https://github.com/ploeh/Hyprlinkr
Bekerja seperti ini:
Rute, seperti biasa:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Dapatkan URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Hasil:
http://localhost/api/foo/1337
Berikut metode KISS untuk menjawab pertanyaan tersebut:
Jika ini adalah kode yang akan Anda gunakan untuk membuat URL pengontrol MVC
@Url.Action("Edit", "MyController")
Untuk mendapatkan URL untuk versi API dari pengontrol (dengan asumsi Anda menggunakan nama pengontrol yang sama), Anda dapat menggunakan
@Url.Action("Edit", "api/MyController")
Semua metode Url.Action yang dilakukan adalah menambahkan jalur root aplikasi, dengan nama pengontrol, diikuti dengan nama tindakan (kecuali "Indeks" dalam hal ini tidak ditambahkan. Jika objek rute nilai memiliki id properti nilainya juga ditambahkan ke URL.
api/sebelum nama pengontrol saya.