ASP.NEt MVC с использованием веб-API для возврата вида Razor

Как сделать представление, возвращенное контроллером и сгенерированное Razor, получить данные из api, я хочу сохранить вид механизма бритвы и использовать api исходный контроллер mvc возвращает представление с данными как параметр, теперь я хочу, чтобы данные из api

Контроллер MVC

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

Модель:

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

Ответы

Ответ 1

Вы можете отправить HTTP-запрос на свой контроллер веб-API из контроллера 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);
    }
}

Также, если вы можете использовать .NET 4.5 async/await, настоятельно рекомендуется сделать это, чтобы избежать блокировки вызовов:

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

Ответ 2

Прочитайте здесь о том, как использовать механизм просмотра Razor внутри вашего контроллера веб-API. Интересная часть - это пакет RazorEngine NuGet для тяжелого подъема.

Ответ 3

Основой ссылки, предоставленной двумя потоками, является создание ваших обработчиков и возврат экземпляра пользовательской реализации IHttpActionResult. Ниже приведен упрощенный пример:

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