W ASP.NET MVC mamy @Url.Action
dla akcji. Czy jest coś podobnego @Url.Api
do / api / kontrolera?
W ASP.NET MVC mamy @Url.Action
dla akcji. Czy jest coś podobnego @Url.Api
do / api / kontrolera?
Odpowiedzi:
ApiController ma właściwość o nazwie URL , który jest typu System.Web.Http.Routing.UrlHelper który pozwala skonstruować adresy URL dla kontrolerów API.
Przykład:
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";
}
...
}
Ten UrlHelper nie istnieje ani w widokach, ani w standardowych kontrolerach.
AKTUALIZACJA:
Aby wykonać routing poza ApiController, możesz wykonać następujące czynności:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
lub wewnątrz widoku:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Zwróć uwagę na httproute = ""
znacznik trasy, który jest ważny.
Oczywiście zakłada się, że Twoja trasa API jest wywoływana DefaultApi
w metodzie RegisterRoutes w Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
do generowania tras interfejsu API poza HttpControllerContext.
Działa z prostszą formą, Url.Action
dzięki czemu nie musisz odwoływać się do żadnych nazw routingu:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Możesz dodać, area = ""
jeśli adres URL jest potrzebny w obszarze. (Kontrolery API są domyślnie poza obszarami). Używam MVC 4.
Url.Action
jest używany z widoku. Url
jest typu System.Web.Mvc.UrlHelper
i nie jest mapowany na WebApi
trasy. Dlatego potrzebny jest dodatkowy parametr: new { httproute = "" }
.
httproute""
ale to nie jest mapowanie = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
ale zadziałało idealnie
Chcesz mieć możliwość generowania łączy w sposób bezpieczny dla typów, bez zakodowanych na stałe ciągów znaków (nazw kontrolerów)?
Jest na to bryłka! (napisane przez Marka Seemana)
https://github.com/ploeh/Hyprlinkr
Działa tak:
Trasy jak zwykle:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Uzyskaj adres URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Wynik:
http://localhost/api/foo/1337
Oto metoda KISS, aby odpowiedzieć na pytanie:
Jeśli jest to kod, którego można użyć do utworzenia adresu URL kontrolera MVC
@Url.Action("Edit", "MyController")
Aby uzyskać adres URL dla wersji API kontrolera (zakładając, że używasz tej samej nazwy kontrolera), możesz użyć
@Url.Action("Edit", "api/MyController")
Wszystko, co robi metoda Url.Action, to dołączanie ścieżki głównej aplikacji z nazwą kontrolera, po której następuje nazwa akcji (chyba że jest to „Indeks”, w którym to przypadku nie jest dodawany. Jeśli obiekt wartości trasy ma identyfikator właściwość wartość jest również dołączana do adresu URL.
api/
mi nazwy kontrolera przed.