ASP.NET MVC 6知らない書き方

25692 ワード

今日Scott Guthrieの1篇の博文《Introducing ASP.NET 5》を見て、MVC 6の中で、いくつか以前知らなかった書き方を発見して、こちらの簡単な記録の下で、自分の知識に対する補充で、一部の私は試みていないで、私が使っているVisual Studio 2015 CTP 5のため、しかし一部は支持していません(以下の第1点)、今Visual Studio 2015はすでにCTP 6に更新して、もともとまた試してみたいと思っていましたが、4.6 Gの大きさを見て、考えてみればやめましょう.
Visual Studio 2015 CTP 6(説明およびダウンロード)Scott Guthrieブログでは、ほとんどがASP.NET 5の総説では、マイクロソフトが以前に発表したものもありますが、私は自分の興味のあるところしか見ていません.もちろん、コメントの内容も漏らすことはできません.このブログのほかに、他のブログの内容も検索しました.以下、簡単に紹介します.

1.統一開発モデル


一般的な書き方:
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
    @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
    </div>
</div>

別の書き方:
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
    <label asp-for="UserName" class="col-md-2 control-label"></label>
    <div class="col-md-10">
        <input asp-for="UserName" class="form-control" />
        <span asp-validation-for="UserName" class="text-danger"></span>
    </div>
</div>

上は一般的にViewでフォームコードを書くときの書き方ですが、明らかに2つ目は1つ目より簡潔です!

2.Dependency injection(DI)書き方


MVC 6ではDIに対応しており、services.AddMvc();のようにMVC 6は付属のIoCを使用して注入されている.もちろん、これらのMVCシステムコンポーネントを注入する以外に、コンフィギュレーションサービスでカスタムオブジェクト注入を使用したことがないので、注入の使い方を初めて知った.例:
public void ConfigureServices(IServiceCollection services) {
    services.AddMvc();
    services.AddTransient<TimeService>();
}

TimeServiceはカスタムタイプで、AddTransientメソッドを使用してConfigureServicesに登録されています.
public class HomeController : Controller
{
    [Activate]
    public TimeService TimeService { get; set; }
 
    // Code removed for brevity
}

Activateは注入オブジェクトのプロパティです.もちろん、コンストラクション関数を使用して注入することもできますが、面倒です.
@using WebApplication23
@inject TimeService TimeSvc
 
<h3>@ViewBag.Message</h3>
 
<h3>
    @TimeSvc.Ticks From Razor
</h3>

上は注入を取得するオブジェクトで、キーワードはinjectです.

3.View componentsのいくつかの内容


View components(VCs)という言葉は初めて見ましたが、もちろん使ったことがありません.componentは要素、構成、部品の意味です.View componentsはビューの補完と理解できます.マイクロソフトは紹介するとき、mini-controllerという言葉を使いました.「マイクロコントローラ」と見なすことができますが、実は@Html.LabelForのような書き方もVCと見なすことができます.通俗的に言えば、私たちはプロジェクトに対して、いくつかのヘルプクラスを書きます.
View Componentの作成:
using System.Linq;
using Microsoft.AspNet.Mvc;
using TodoList.Models;

namespace TodoList.ViewComponents {
  //[ViewComponent(Name = "PriorityList")]
  public class PriorityListViewComponent : ViewComponent {
    private readonly ApplicationDbContext db;
    public PriorityListViewComponent(ApplicationDbContext context)
    {
      db = context;
    }

    public IViewComponentResult Invoke(int maxPriority)
    {
      var items = db.TodoItems.Where(x => x.IsDone == false &&
                                        x.Priority <= maxPriority);
      return View(items);
    }
  }
}

作成されたPriorityListView Componentは、View Componentを継承する必要があります.View Componentは、View Componentの名前の書き換えです.
@{
  ViewBag.Title = "ToDo Page";
}

<div class="jumbotron">
  <h1>ASP.NET vNext</h1>
</div>

<div class="row">
  <div class="col-md-4">
    @Component.Invoke("PriorityList", 1)   
  </div>
</div>

上はView Componentの呼び出しコードで、書き方はComponentです.Invokeは、最初のパラメータがView Componentのクラス名であるか、属性の書き換え名であるか、2番目のパラメータが優先度値であり、処理するアイテムのセットをフィルタするために使用されます.
これはView Component Invokeの同期書き方であり、最も簡単な書き方でもあるが、この書き方はMVC 6から削除されている.説明:The synchronous Invoke method has been removed.A best practice is to use asynchronous methods when calling a database.
InvokeAsync書き方:
public async Task<IViewComponentResult> InvokeAsync(int maxPriority, bool isDone) {
    string MyView = "Default";

    // If asking for all completed tasks, render with the "PVC" view.
    if (maxPriority > 3 && isDone == true)
    {
        MyView = "PVC";
    }

    var items = await GetItemsAsync(maxPriority, isDone);
    return View(MyView, items);
}

呼び出しコード:
@model IEnumerable<TodoList.Models.TodoItem>

<h2> PVC Named Priority Component View</h2>
<h4>@ViewBag.PriorityMessage</h4>
<ul>
    @foreach (var todo in Model)
    {
        <li>@todo.Title</li>
    }
</ul>
@await Component.InvokeAsync("PriorityList",  4, true)

注意PriorityMessageの値で、上のコードはビュー名を指定します.

4.ビューにサービスを注入する


サービスはビューに注入され、上述の第2点DIの書き方を使用し、例示的なサービス:
using System.Linq;
using System.Threading.Tasks;
using TodoList.Models;

namespace TodoList.Services {
  public class StatisticsService {
    private readonly ApplicationDbContext db;

    public StatisticsService(ApplicationDbContext context)
    {
      db = context;
    }

    public async Task<int> GetCount()
    {
      return await Task.FromResult(db.TodoItems.Count());
    }

    public async Task<int> GetCompletedCount()
    {
      return await Task.FromResult(
          db.TodoItems.Count(x => x.IsDone == true));
    }
  }
}

ConfigureServicesに登録:
// This method gets called by the runtime.
public void ConfigureServices(IServiceCollection services)
{
  // Add MVC services to the services container.
  services.AddMvc();

  services.AddTransient<TodoList.Services.StatisticsService>();
}

呼び出しコード:
@inject TodoList.Services.StatisticsService Statistics
@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>ASP.NET vNext</h1>
</div>

<div class="row">
    <div class="col-md-4">
        @await Component.InvokeAsync("PriorityList", 4, true)

      <h3>Stats</h3>
      <ul>
        <li>Items: @await Statistics.GetCount()</li>
        <li>Completed:@await Statistics.GetCompletedCount()</li>
        <li>Average Priority:@await Statistics.GetAveragePriority()</li>
      </ul>
    </div>
</div>

参考資料:
Introducing ASP.NET 5
ASP.NET 5 Overview
View components and Inject in ASP.NET MVC 6