• ASP.NET 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. 统一开发模型

    普通写法:

    @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. Dependency injection (DI) 写法

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

    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,说通俗一点,就是我们针对项目,写的一些帮助类。

    创建 ViewComponent:

    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);
        }
      }
    }
    

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

    @{
      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>
    

    上面是 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 写法:

    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)
    

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

    4. 注入一个服务到视图

    服务注入到视图,就是使用的上面第二点 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>
    

    参考资料:

  • 相关阅读:
    接口测试
    jmeter直连数据库
    登录功能的测试用例设计
    oracle 同义词synonym
    oracle常用函数
    python环境搭建--pycharm的安装及使用
    JavaScript数组函数
    JavaScript:var、let、作用域
    HTML入门到精通(带你全面避坑)
    使用VirtualBox安装CentOS7
  • 原文地址:https://www.cnblogs.com/xishuai/p/asp-net-mvc-6-part.html
Copyright © 2020-2023  润新知