2014-03-03 8 views
15

Wie die von der Steuerung zurückgegebene und von Razor erzeugte Ansicht erhalten die Daten von der API Ich möchte die Rasierer-Engine anzeigen und verwenden Sie die API der ursprünglichen MVC Controller gibt die Ansicht mit den Daten als Parameter nun i die Daten aus der api wollenASP.NEt MVC mit Web-API, um eine Razor-Ansicht

MVC-Controller

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

api-Controller

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

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

Mo del:

@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> 

Antwort

17

Sie könnten eine HTTP-Anfrage an Ihren Web-API-Controller aus den ASP.NET MVC-Controller senden:

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

Auch wenn Sie die Vorteile von .NET 4.5 async/await nehmen wird nachdrücklich empfohlen, so zu vermeiden, blockieren Anrufe zu tun empfohlen:

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); 
    } 
} 
+0

ich ein HTML-Client erstellt, der die API-URL/api/Produkte nennt es funktionierte, aber es gibt ein Problem mit dem ("http://yourapi.com/api/products ") was soll ich hier genau setzen ?? – user3353484

+0

Sie sollten die URL Ihres Web-API-Endpunkts die Liste der Produkte zurückgeben. –

+0

danke !! Kann ich die URL durch @ Url.Action ersetzen? – user3353484

12

lesen here, wie in Ihren Web-API-Controller die Razor-Ansicht-Engine verwenden. Der interessante Teil ist die Verwendung der RazorEngine NuGet package, um das schwere Heben zu tun.

+0

Danke für den nützlichen Link. –

+0

Ihre Antwort ist definitiv bessere Antwort als HTTP-Anfrage von MVC zu API-Controller zu tun. Ich weiß nicht, warum diese Antwort so viele Upvotes hat, aber von der Performance ist es Unsinn, es zu tun. – Regfor

0

Die Basis der von twoflower bereitgestellten Verknüpfung besteht darin, dass Ihre Handler eine Instanz einer benutzerdefinierten IHttpActionResult-Implementierung erstellen und zurückgeben. Ein vereinfachtes Beispiel ist unten dargestellt:

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); 
    } 
} 
Verwandte Themen