ASP.NET MVC'de @Url.Action
eylemlerimiz var. @Url.Api
/ Api / controller'a yönlendirmek gibi benzer bir şey var mı ?
ASP.NET MVC'de @Url.Action
eylemlerimiz var. @Url.Api
/ Api / controller'a yönlendirmek gibi benzer bir şey var mı ?
Yanıtlar:
ApiController adlı bir özelliğe sahiptir URL tipi olan System.Web.Http.Routing.UrlHelper Api denetleyicileri için URL'ler oluşturmak için izin verir.
Misal:
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";
}
...
}
Bu UrlHelper ne sizin görünümlerinizde ne de standart denetleyicilerde mevcut değildir.
GÜNCELLEME:
Ve bir ApiController dışında yönlendirme yapmak için aşağıdakileri yapabilirsiniz:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
veya bir görünümün içinde:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
httproute = ""
Önemli olan yol jetonuna dikkat edin .
Açıkçası bu, Api DefaultApi
yolunuzun RegisterRoutes yönteminizde şu konumda çağrıldığını varsayar Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
HttpControllerContext dışında Api yolları oluşturmak için normali nasıl kullanabileceğinizi göstermek için cevabımı güncelledim .
Daha basit şekliyle çalışır, Url.Action
böylece herhangi bir Yönlendirme adına başvurmanız gerekmez:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
area = ""
Bir Alan içinde URL gerekliyse, bir eklemek isteyebilirsiniz . (Api denetleyicileri varsayılan olarak Alanların dışındadır.) MVC 4 kullanıyorum.
Url.Action
bir Görünümden kullanıldığını ima ediyor . Url
tiptedir System.Web.Mvc.UrlHelper
ve bu eşleşmiyor WebApi
yolları. Fazladan parametreyi ihtiyaç nedeni budur: new { httproute = "" }
.
httproute""
ama eşleme değil = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
ancak bu mükemmel çalıştı
Bağlantıları, sabit kodlanmış dizeler (denetleyici adları) olmadan, tip güvenli bir şekilde oluşturabilmek ister misiniz?
Bunun için bir nuget var! (ve Mark Seeman tarafından yazılmıştır)
https://github.com/ploeh/Hyprlinkr
Şu şekilde çalışır:
Her zamanki gibi rotalar:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Bir URL alın:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Sonuç:
http://localhost/api/foo/1337
İşte soruyu cevaplamak için KISS yöntemi:
Bu, bir MVC denetleyici URL'si oluşturmak için kullanacağınız kodsa
@Url.Action("Edit", "MyController")
Denetleyicinin API sürümü için bir URL almak için (aynı denetleyici adını kullandığınızı varsayarak) kullanabilirsiniz.
@Url.Action("Edit", "api/MyController")
Url.Action yönteminin yaptığı tek şey, uygulamanın kök yolunu, denetleyici adı ve ardından eylem adı ("Dizin" değilse, bu durumda eklenmez. Rota değerleri nesnesinin bir kimliği varsa) özellik, değer de URL'ye eklenir.
api/
Denetleyici adımdan önceki adı eksikti .