In ASP.NET MVC haben wir @Url.Action
für Aktionen. Gibt es etwas Ähnliches, @Url.Api
das an / api / controller weiterleiten würde?
In ASP.NET MVC haben wir @Url.Action
für Aktionen. Gibt es etwas Ähnliches, @Url.Api
das an / api / controller weiterleiten würde?
Antworten:
Der ApiController verfügt über eine Eigenschaft namens Url vom Typ System.Web.Http.Routing.UrlHelper , mit der Sie URLs für API-Controller erstellen können.
Beispiel:
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";
}
...
}
Dieser UrlHelper existiert weder in Ihren Ansichten noch in den Standard-Controllern.
AKTUALISIEREN:
Und um Routing außerhalb eines ApiControllers durchzuführen, können Sie Folgendes tun:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
oder in einer Ansicht:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Beachten Sie das httproute = ""
wichtige Routentoken.
Dies setzt natürlich voraus, dass Ihre API-Route DefaultApi
in Ihrer RegisterRoutes-Methode aufgerufen wird in Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
, um API-Routen außerhalb eines HttpControllerContext zu generieren.
Es funktioniert mit der einfacheren Form, Url.Action
sodass Sie keine Routing-Namen referenzieren müssen:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Möglicherweise möchten Sie eine hinzufügen, area = ""
wenn die URL in einem Bereich benötigt wird. (API-Controller befinden sich standardmäßig außerhalb von Bereichen.) Ich verwende MVC 4.
Url.Action
dass aus einer Ansicht verwendet wird. Url
ist vom Typ System.Web.Mvc.UrlHelper
und wird keinen WebApi
Routen zugeordnet. Deshalb benötigen Sie den zusätzlichen Parameter : new { httproute = "" }
.
httproute""
aber es ist nicht Mapping = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
aber das funktionierte perfekt
Möchten Sie typsichere Links ohne fest codierte Zeichenfolgen (Controller-Namen) generieren können?
Dafür gibt es ein Nuget! (und es ist von Mark Seeman geschrieben)
https://github.com/ploeh/Hyprlinkr
Funktioniert so:
Routen wie gewohnt:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Holen Sie sich eine URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Ergebnis:
http://localhost/api/foo/1337
Hier ist die KISS-Methode zur Beantwortung der Frage:
Wenn dies der Code ist, den Sie zum Erstellen einer MVC-Controller-URL verwenden würden
@Url.Action("Edit", "MyController")
Um eine URL für die API-Version des Controllers zu erhalten (vorausgesetzt, Sie verwenden denselben Controllernamen), können Sie diese verwenden
@Url.Action("Edit", "api/MyController")
Bei der Url.Action-Methode wird lediglich der Stammpfad der Anwendung mit dem Controllernamen gefolgt vom Aktionsnamen angehängt (es sei denn, es handelt sich um "Index". In diesem Fall wird er nicht angehängt. Wenn das Routenwertobjekt eine ID hat Eigenschaft Der Wert wird auch an die URL angehängt.
api/
Name vor meinem Controller.