MVC 6表記

14316 ワード

MVC 6不知道的书方法


今日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

  • 作成者:
    田園のコオロギ  
    出典:
    http://www.cnblogs.com/xishuai/