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