Ich habe eine Helfer-Erweiterung erstellt, die mir stark getippte Ausdrücke mit UrlHelper
in MVC Rasierer haben kann. Dies funktioniert sehr gut zum Auflösen von URIs für meine MVC-Controller mit Ansichten.Resolve WebApi Aktion Url aus MVC View mit MVC.UrlHelper
<a href="@(Url.Action<HomeController>(c=>c.Index()))">Home</a>
<li>@(Html.ActionLink<AccountController>("Sign in", c => c.Signin(null)))</li>
<li>@(Html.ActionLink<AccountController>("Create an account", c => c.Signup(), htmlAttributes: null))</li>
@using (Html.BeginForm<ToolsController>(c => c.Track(null), FormMethod.Get, htmlAttributes: new { @class = "navbar-form", role = "search" })) {...}
Ich habe jetzt einen Blick, wo ich Knockout zu verwenden, ich versuche, einige Daten zu meiner Web-api zu schreiben und müssen in der Lage so etwas wie dieses
var targetUrl = '@(Url.HttpRouteUrl<TestsApiController>(c => c.TestAction(null)))';
so dass ich don zu tun Ich muss meine URLs hart codieren (Magic strings)
Meine aktuelle Implementierung meiner Erweiterungsmethode zum Abrufen der Web-API-URL ist wie folgt definiert.
private const string HttpRouteKey = "httproute";
public static string HttpRouteUrl<TController>(this UrlHelper urlHelper, Expression<Action<TController>> action)
where TController : System.Web.Http.ApiController {
RouteValueDictionary routeValues = InternalExpressionHelper.GetRouteValues(action);
if (!routeValues.ContainsKey(HttpRouteKey)) {
routeValues.Add(HttpRouteKey, true);
}
var scheme = urlHelper.RequestContext.HttpContext.Request.Url.Scheme;
var route = urlHelper.Action(null, null, rvd, scheme);
//I've also tried
//var route = urlHelper.HttpRouteUrl(null, rvd);
return route;
}
InternalExpressionHelper.GetRouteValues
inspiziert die Expression und erzeugt ein RouteValueDictionary
, das verwendet wird, um die URL zu erzeugen.
Problem ist, dass meine route
immer null
zurückgibt. Frühere Fragen zu SO und Blogs gefunden haben angezeigt, dass durch die Einbeziehung der httproute
in das Wörterbuch würde die Möglichkeit, WebApi URLs von MVC.UrlHelper
Route Sammlung erhalten.
Bis jetzt scheint keine der angenommenen Antworten für mich zu arbeiten, da ich Attribut-Routing ohne Routenname verwende.
FYI, es gibt bereits eine Open-Source-Bibliothek, um das [hier] (https://github.com/ploeh/Hyprlinkr) zu tun. – NightOwl888
Ich greife schon durch die Quelle, um zu sehen, wie es dort gemacht wird – Nkosi