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の総説では、マイクロソフトが以前に発表したものもありますが、私は自分の興味のあるところしか見ていません.もちろん、コメントの内容も漏らすことはできません.このブログのほかに、他のブログの内容も検索しました.以下、簡単に紹介します.
一般的な書き方:
別の書き方:
上は一般的にViewでフォームコードを書くときの書き方ですが、明らかに2つ目は1つ目より簡潔です!
MVC 6ではDIに対応しており、
TimeServiceはカスタムタイプで、AddTransientメソッドを使用してConfigureServicesに登録されています.
Activateは注入オブジェクトのプロパティです.もちろん、コンストラクション関数を使用して注入することもできますが、面倒です.
上は注入を取得するオブジェクトで、キーワードはinjectです.
View components(VCs)という言葉は初めて見ましたが、もちろん使ったことがありません.componentは要素、構成、部品の意味です.View componentsはビューの補完と理解できます.マイクロソフトは紹介するとき、mini-controllerという言葉を使いました.「マイクロコントローラ」と見なすことができますが、実は
View Componentの作成:
作成されたPriorityListView Componentは、View Componentを継承する必要があります.View Componentは、View Componentの名前の書き換えです.
上は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書き方:
呼び出しコード:
注意PriorityMessageの値で、上のコードはビュー名を指定します.
サービスはビューに注入され、上述の第2点DIの書き方を使用し、例示的なサービス:
ConfigureServicesに登録:
呼び出しコード:
参考資料:
Introducing ASP.NET 5
ASP.NET 5 Overview
View components and Inject in ASP.NET MVC 6
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