MVC 6 一些不晓得的写法

今天在看 Scott Guthrie 的一篇博文《Introducing ASP.NET 5》,在 MVC 6 中,发现有些之前不晓得的写法,这边简单记录下,算是对自己知识的补充,有些我并没有进行尝试,因为我使用的 Visual Studio 2015 CTP 5,但是有些并没有支持(下面第一点),现在 Visual Studio 2015 已经更新到 CTP 6 了,本来还想尝试下,看了下 4.6G 的大小,想想还是算了。

Scott Guthrie 博文中,大部分是对 ASP.NET 5 的综述,有些内容之前微软都已经发布过了,我只看了自己看兴趣的地方,当然评论内容也是不能漏掉的,除了这篇博文,我还搜刮了其他博文的一些内容,下面简单介绍下。

1. 统一开发模型

普通写法:

  1. @Html.ValidationSummary(true, "", new { @class = "text-danger" })
  2. <div class="form-group">
  3. @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
  4. <div class="col-md-10">
  5. @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
  6. @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
  7. </div>
  8. </div>

另类写法:

  1. <div asp-validation-summary="ModelOnly" class="text-danger"></div>
  2. <div class="form-group">
  3. <label asp-for="UserName" class="col-md-2 control-label"></label>
  4. <div class="col-md-10">
  5. <input asp-for="UserName" class="form-control" />
  6. <span asp-validation-for="UserName" class="text-danger"></span>
  7. </div>
  8. </div>

上面一般是我们在 View 写表单代码时候的写法,很明显,第二种比第一种更加简洁!

2. Dependency injection (DI) 写法

在 MVC 6 中是支持 DI 的,像 services.AddMvc(); 就是 MVC 6 使用自带的 IoC 进行注入,当然,除了注入这些 MVC 系统组件,我是没有在 ConfigureServices 中使用过自定义的对象注入,所以,我也是第一次晓得注入使用写法,示例:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc();
  4. services.AddTransient<TimeService>();
  5. }

TimeService 是一个自定义的类型,使用 AddTransient 方法,在 ConfigureServices 中进行注册。

  1. public class HomeController : Controller
  2. {
  3. [Activate]
  4. public TimeService TimeService { get; set; }
  5. // Code removed for brevity
  6. }

Activate 为注入对象属性,当然,你也可以使用构造函数进行注入,只不过是麻烦些。

  1. @using WebApplication23
  2. @inject TimeService TimeSvc
  3. <h3>@ViewBag.Message</h3>
  4. <h3>
  5. @TimeSvc.Ticks From Razor
  6. </h3>

上面为获取注入的对象,关键字为 inject。

3. View components 的一些内容

View components(VCs) ,我是第一次看到这个词,当然更没用过,component 是要素、组成、零件的意思,View components 可以理解为视图的补充,微软在介绍的时候,用到了一个词 mini-controller,可以看作是“微型控制器”,其实,像 @Html.LabelFor 这种写法也可以看作是 VC,说通俗一点,就是我们针对项目,写的一些帮助类。

创建 ViewComponent:

  1. using System.Linq;
  2. using Microsoft.AspNet.Mvc;
  3. using TodoList.Models;
  4. namespace TodoList.ViewComponents
  5. {
  6. //[ViewComponent(Name = "PriorityList")]
  7. public class PriorityListViewComponent : ViewComponent
  8. {
  9. private readonly ApplicationDbContext db;
  10. public PriorityListViewComponent(ApplicationDbContext context)
  11. {
  12. db = context;
  13. }
  14. public IViewComponentResult Invoke(int maxPriority)
  15. {
  16. var items = db.TodoItems.Where(x => x.IsDone == false &&
  17. x.Priority <= maxPriority);
  18. return View(items);
  19. }
  20. }
  21. }

创建的 PriorityListViewComponent 需要继承 ViewComponent,ViewComponent 是对 ViewComponent 名字的重写。

  1. @{
  2. ViewBag.Title = "ToDo Page";
  3. }
  4. <div class="jumbotron">
  5. <h1>ASP.NET vNext</h1>
  6. </div>
  7. <div class="row">
  8. <div class="col-md-4">
  9. @Component.Invoke("PriorityList", 1)
  10. </div>
  11. </div>

上面是 ViewComponent 的调用代码,写法是 Component.Invoke,第一个参数是 ViewComponent 的类名,也可以是属性的重写名,第二个参数是优先级值,用于过滤我们要处理的项集合。

这是 ViewComponent Invoke 同步写法,也是最简单的一种,但是这种写法,现在已经在 MVC 6 中被移除了,说明:The synchronous Invoke method has been removed. A best practice is to use asynchronous methods when calling a database.

InvokeAsync 写法:

  1. public async Task<IViewComponentResult> InvokeAsync(int maxPriority, bool isDone)
  2. {
  3. string MyView = "Default";
  4. // If asking for all completed tasks, render with the "PVC" view.
  5. if (maxPriority > 3 && isDone == true)
  6. {
  7. MyView = "PVC";
  8. }
  9. var items = await GetItemsAsync(maxPriority, isDone);
  10. return View(MyView, items);
  11. }

调用代码:

  1. @model IEnumerable<TodoList.Models.TodoItem>
  2. <h2> PVC Named Priority Component View</h2>
  3. <h4>@ViewBag.PriorityMessage</h4>
  4. <ul>
  5. @foreach (var todo in Model)
  6. {
  7. <li>@todo.Title</li>
  8. }
  9. </ul>
  10. @await Component.InvokeAsync("PriorityList", 4, true)

注意 ViewBag.PriorityMessage 的值,上面代码指定了视图名称。

4. 注入一个服务到视图

服务注入到视图,就是使用的上面第二点 DI 写法,示例服务:

  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using TodoList.Models;
  4. namespace TodoList.Services
  5. {
  6. public class StatisticsService
  7. {
  8. private readonly ApplicationDbContext db;
  9. public StatisticsService(ApplicationDbContext context)
  10. {
  11. db = context;
  12. }
  13. public async Task<int> GetCount()
  14. {
  15. return await Task.FromResult(db.TodoItems.Count());
  16. }
  17. public async Task<int> GetCompletedCount()
  18. {
  19. return await Task.FromResult(
  20. db.TodoItems.Count(x => x.IsDone == true));
  21. }
  22. }
  23. }

ConfigureServices 中注册:

  1. // This method gets called by the runtime.
  2. public void ConfigureServices(IServiceCollection services)
  3. {
  4. // Add MVC services to the services container.
  5. services.AddMvc();
  6. services.AddTransient<TodoList.Services.StatisticsService>();
  7. }

调用代码:

  1. @inject TodoList.Services.StatisticsService Statistics
  2. @{
  3. ViewBag.Title = "Home Page";
  4. }
  5. <div class="jumbotron">
  6. <h1>ASP.NET vNext</h1>
  7. </div>
  8. <div class="row">
  9. <div class="col-md-4">
  10. @await Component.InvokeAsync("PriorityList", 4, true)
  11. <h3>Stats</h3>
  12. <ul>
  13. <li>Items: @await Statistics.GetCount()</li>
  14. <li>Completed:@await Statistics.GetCompletedCount()</li>
  15. <li>Average Priority:@await Statistics.GetAveragePriority()</li>
  16. </ul>
  17. </div>
  18. </div>

参考资料:

MVC 6 写法的更多相关文章

  1. JS 实现MVC的写法

    案例:当select 下拉选择框值变化时,显示其值(不是文本) 常规写法 <h3>JavaScript no MVC</h3>  <div>   <selec ...

  2. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  3. 【开源】 bsf.mvc spingboot的扩展

    springboot的扩展实现,让springboot开发更加简单:形成demo模板,以后开发更方便. 开源地址:https://gitee.com/chejiangyi/bsf.mvc/tree/m ...

  4. mvc中的表现和数据分离怎么理解?

    使用过 JavaScript框架(如 AngularJS, Backbone)的人都很熟悉在UI(用户界面,前端)中mvc的工作机理.这些框架实现了MVC,使得在一个单页面中实现根据需要变化视图时更加 ...

  5. ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

    写在前面 ASP.NET Core是微软新推出的支持跨平台.高性能.开源的开发框架,它的优势不必多说,因为已经说得太多了.当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大 ...

  6. Android mvp模式、mvvm模式

    MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...

  7. Go语言Web框架gwk介绍 1

    Go语言Web框架gwk介绍 (一)   今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布 ...

  8. ASP.NET Web API 之一 入门篇

    一.基于RESTful标准的Web Api 原文讲解:https://www.cnblogs.com/lori/p/3555737.html 微软的web api是在vs2012上的mvc4项目绑定发 ...

  9. Springboot学习问题记录

    1.spring boot与cloud构建微服务,返回数据从json变成了xml 问题:本身spingboot项目是用@RestController注解,返回结果也是json格式,但是结合spring ...

随机推荐

  1. Nginx + IIS

    Nginx + IIS 配置,实现负载均衡   当你的Web应用程序访问量大的时候,一台服务器可能会因为压力过大而无法处理所有的请求.此时,可以增加服务器,采用负载均衡来分担所有的请求.关于Nginx ...

  2. ACdreamoj1110(多重背包)

    意甲冠军:多个裸露的双肩背包.水的问题. 解决方法:然背包一样,仅仅只是加一个数组,记录着每一个物品用过的次数,多于存储量时就pass不更新. 另一种方法是将每一个物品用二进制压缩处理.第一个代码比較 ...

  3. POJ3617 Best Cow Line 馋

    虽然这个问题很简单,但非常好,由于过程是很不错的.发展思路的比较 并鼓励人们,不像有些贪心太偏,推动穷人,但恼人 鉴于长N弦S,然后又空字符串STR.每当有两个选择 1:删S增加虚假的第一要素STR于 ...

  4. jquery :操作iframe

    原文 jquery :操作iframe 1. 内容里有两个ifame <iframe id="leftiframe"...</iframe> <iframe ...

  5. 开源GUI-Microwindows之程序入口分析

    **************************************************************************************************** ...

  6. HDU 3788 和九度OJ 1006测试数据是不一样的

    ZOJ问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. Gradle增量学习建筑

    请在本系列下面的文章下载Github演示示例代码: git clone https://github.com/davenkin/gradle-learning.git       假设我们Gradle ...

  8. 数据存储(两)--SAX发动机XML记忆(附Demo)

    Android SDK支撑SAX读取技术XML,SAX通过连续的读取方式来处理XML文件.这要求每个读数XML对应的事件触发,以处理该节点的文件的节点.以下是基于一个例子来告诉SAX使用: publi ...

  9. WSHPSRS-匹克选择列表生成器-SRS(R12.2.3)

     匹克选择列表生成器-SRS(R12.2.3) --US Program:Pick Selection List Generation - SRS Short Name:WSHPSRS Appli ...

  10. 【剑指offer】:Q44:直扑克

    def IsContinuous(seq, num = 5): zeros = 0; d = 0 seq = sorted(seq) for i in range(num - 1): if seq[i ...