Jak tworzyć ASP.NET Web API Url?

W ASP.NET MVC, mamy @Url.Action dla akcji. Czy jest coś podobnego jak @Url.Api, które przekierowywałoby do/api / controller?

Author: tugberk, 2012-02-29

4 answers

ApiController posiada właściwość o nazwie Url , która jest typu System.Www.Http./ Align = "left" / UrlHelper, który pozwala na konstruowanie adresów URL dla kontrolerów api.

Przykład:

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";
    }

    ...
}

Ten UrlHelper nie istnieje ani w Twoich poglądach, ani w standardowych kontrolerach.


Aktualizacja:

I w celu routingu poza Apicontrollerem możesz wykonać następujące czynności:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

Lub wewnątrz widoku:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

Zawiadomienie znacznik trasy httproute = "", który jest ważny.

Oczywiście zakłada to, że trasa Api jest wywoływana DefaultApi w metodzie RegisterRoutes w Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
 128
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-29 16:44:25

Działa z prostszą formą Url.Action więc nie musisz odwoływać się do żadnych nazw routingu:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

Możesz dodać area = "", jeśli URL jest potrzebny w obszarze. (Kontrolery Api domyślnie znajdują się poza obszarami.) Używam MVC 4.

 43
Author: Gábor Imre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-14 12:13:55

Chcesz być w stanie generować linki w sposób bezpieczny dla typów, bez zakodowanych na twardo łańcuchów (nazw kontrolerów)?

Do tego jest nuget! (a autorem jest Mark Seeman)

Https://github.com/ploeh/Hyprlinkr

Działa tak:

Trasy, jak zwykle:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

Pobierz adres URL:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

Wynik:

http://localhost/api/foo/1337
 5
Author: Cristi Diaconescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-16 14:43:37

Oto metoda KISS na odpowiedź na pytanie:

Jeśli jest to kod, którego chcesz użyć do utworzenia adresu URL kontrolera MVC

@Url.Action("Edit", "MyController")

Aby uzyskać adres URL dla wersji API kontrolera (zakładając, że używasz tej samej nazwy kontrolera), możesz użyć

@Url.Action("Edit", "api/MyController")

Wszystkie Url.Metoda akcji jest dopisywana do głównej ścieżki aplikacji, z nazwą kontrolera, po której następuje nazwa akcji (chyba że jest to "Index", w którym to przypadku nie jest dopisywana. jeśli trasa obiekt values posiada właściwość id wartość jest również dołączana do adresu URL.

 1
Author: James Bunch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 18:13:51