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の大きさを見て、考えてみればやめましょう.
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>
参考資料:
作成者:
田園のコオロギ
出典:
http://www.cnblogs.com/xishuai/