web-dev-qa-db-fra.com

ASP.NEt MVC utilisant l'API Web pour renvoyer une vue Razor

Comment faire pour que la vue retournée par le contrôleur et générée par Razor récupère les données de l'API Je veux garder la vue du moteur de rasoir et utiliser l'API Le contrôleur MVC d'origine renvoie la vue avec les données comme paramètre maintenant je veux les données de la api

Contrôleur MVC

public class ProductController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

Contrôleur Api

public class ProductsController : ApiController
{
    private ApplicationDbContext db = new ApplicationDbContext();

    // GET api/Products
    public IEnumerable<Product> GetProducts()
    {
        return db.Products;
    }
}

Modèle:

@model IEnumerable<WebApplication2.Models.Product>

@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.Name)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Category)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Price)
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Category)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Price)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
        @Html.ActionLink("Details", "Details", new { id=item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.Id })
    </td>
</tr>
}
</table>
17
user3353484

Vous pouvez envoyer une demande HTTP à votre contrôleur Web API à partir du contrôleur ASP.NET MVC:

public class ProductController : Controller
{
    public ActionResult Index()
    {
        var client = new HttpClient();
        var response = client.GetAsync("http://yourapi.com/api/products").Result;
        var products = response.Content.ReadAsAsync<IEnumerable<Product>>().Result;
        return View(products);
    }
}

De plus, si vous pouvez profiter de l'asynchronisation/attente de .NET 4.5, il est fortement recommandé de le faire pour éviter de bloquer les appels:

public class ProductController : Controller
{
    public async Task<ActionResult> Index()
    {
        var client = new HttpClient();
        var response = await client.GetAsync("http://yourapi.com/api/products");
        var products = await response.Content.ReadAsAsync<IEnumerable<Product>>();
        return View(products);
    }
}
18
Darin Dimitrov

Lisez ici sur la façon d'utiliser le moteur de vue Razor dans votre contrôleur API Web. La partie intéressante utilise le package RazorEngine NuGet pour faire le gros du travail.

17
twoflower

La base du lien fourni par twoflower est que vos gestionnaires créent et renvoient une instance d'une implémentation IHttpActionResult personnalisée. Un exemple simplifié est illustré ci-dessous:

public class TestHttpActionResult : IHttpActionResult
{
    private readonly HttpRequestMessage _request;
    private readonly string _responseString;

    public TestHttpActionResult(HttpRequestMessage request, string responseString)
    {
        _request = request;
        _responseString = responseString;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = _request.CreateResponse(HttpStatusCode.Created);
        response.Content = new StringContent(_responseString);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
        return Task.FromResult(response);
    }
}
1
andrew pate