Di ASP.NET MVC, kami memiliki @Url.Action
tindakan. Apakah ada sesuatu yang serupa seperti @Url.Api
yang akan diarahkan ke / api / controller?
Di ASP.NET MVC, kami memiliki @Url.Action
tindakan. Apakah ada sesuatu yang serupa seperti @Url.Api
yang 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 DefaultApi
dalam metode RegisterRoutes Anda di Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
untuk menghasilkan rute Api di luar HttpControllerContext.
Ini bekerja dengan bentuk yang lebih sederhana Url.Action
sehingga 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.Action
sedang digunakan dari View. Url
adalah tipe System.Web.Mvc.UrlHelper
, dan tidak memetakan ke WebApi
rute. 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.