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: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.quelle
Url.Action
dass aus einer Ansicht verwendet wird.Url
ist vom TypSystem.Web.Mvc.UrlHelper
und wird keinenWebApi
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 perfektMö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:
Holen Sie sich eine URL:
Ergebnis:
quelle
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
Um eine URL für die API-Version des Controllers zu erhalten (vorausgesetzt, Sie verwenden denselben Controllernamen), können Sie diese verwenden
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.
quelle
api/
Name vor meinem Controller.