ASP.NET Web API URL'si nasıl oluşturulur?


Yanıtlar:


139

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 DefaultApiyolunuzun 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 }
);

Güvenli bir şekilde Url'ler oluşturabilmek için Görünümüme ihtiyacım olduğu için bu .. gerçekten bana pek yardımcı olmuyor. Canlı Yayına Geçme lisansı varsa, Görünümde url oluşturmanın 'Canlı Yayına Geçme' yolu nedir?
Shane Courtrille

Daha da önemlisi, ASP.Net Geliştirme Sunucusu kullanıyorsanız, bağlantı noktalarını her zaman değiştirdiği için bu işlem işe yaramaz, böylece görünümdeki url'yi bile ekleyemezsiniz.
Shane Courtrille

@ShaneCourtrille, System.Web.Mvc.UrlHelperHttpControllerContext dışında Api yolları oluşturmak için normali nasıl kullanabileceğinizi göstermek için cevabımı güncelledim .
Darin Dimitrov

Çok teşekkürler! RouteUrl'yi kullanmaya çalışıyordum, ancak HTProute parametresi gereksinimini bilmiyordum.
Shane Courtrille

2
Örneklemin amacını anlıyorum; Bir satır ViewBag kodu atarsanız daha yararlı bir örnek olacağını söylüyorum çünkü bu değerin olası bir senaryoda elde etmeye çalıştığımız şey olduğunu ve sadece bazı rastgele kodların çalıştırılmadığını göstermiş olursunuz . Yine, belirli bir kod satırının konuyla ilgili olduğunu nihayet fark etmeden önce, kaçırdığım şeyi fark edemeyerek birkaç dakikamı boşa harcamasaydım, yorum yapmazdım.
Jon Davis

43

Daha basit şekliyle çalışır, Url.Actionbö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.


7
Web Api'deki UrlHelper, msdn.microsoft.com/en-us/library/… şeklindedir , bir eylem yöntemi yoktur.
Yuriy Faktorovich

8
@YuriyFaktorovich Bu gönderi Url.Actionbir Görünümden kullanıldığını ima ediyor . Urltiptedir System.Web.Mvc.UrlHelperve bu eşleşmiyor WebApiyolları. Fazladan parametreyi ihtiyaç nedeni budur: new { httproute = "" }.
Jesse

3
Ekledim httproute""ama eşleme değil = /
Maslow

Bağlantıyı boş bir alan ve null htmlAttributes ile eklemek zorunda kaldım @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) ancak bu mükemmel çalıştı
Christopher G. Lewis

2
Bu, bir görünümden mükemmel şekilde çalışır, ancak, eylemin adını neden / api / dashboard? Action = getdata gibi bir sorgu dizesi olarak oluşturduğundan emin değilim. Bunu bekliyordum: / api / dashboard / getdata
umutesen

7

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

3

İş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.


Teşekkür ederim! api/Denetleyici adımdan önceki adı eksikti .
Daniel Congrove
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.