web-dev-qa-db-ja.com

Web APIを使用してRazorビューを返すASP.NEt MVC

コントローラーから返され、Razorによって生成されたビューをAPIからデータを取得し、かみそりエンジンビューを保持し、元のmvcコントローラーがAPIを使用するようにする方法api

MVCコントローラー

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

APIコントローラー

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>
17
user3353484

ASP.NET MVCコントローラー内からWeb APIコントローラーにHTTP要求を送信できます。

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);
    }
}
18
Darin Dimitrov

Web APIコントローラー内でRazorビューエンジンを使用する方法については、 こちら をお読みください。興味深い部分は、 RazorEngine NuGetパッケージ を使用して重い作業を行うことです。

17
twoflower

Twoflowerが提供するリンクの基本は、ハンドラーがカスタム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);
    }
}
1
andrew pate