Asp.net vNext 学习之路(二)

View component(视图组件)应该是MVC6 新加的一个东西,类似于分部视图。本文将演示在mvc 6中 怎么添加视图组件以及怎么在视图中注入一个服务。

本文包括以下内容:

1,创建一个新的asp.net vNext 项目。

2,安装 KVM(K version manager)。

3,如何运行EF 数据库迁移。

4,什么是 view component。

5,如何在 mvc 6 中添加一个view component 。

6,如何在view 中注入一个服务。

一 创建一个新的asp.net vNext 项目

打开vs 2015 。 File>New >Project>Templates>C#>Web>Asp.Net Application 点击OK。然后选择 New ASP.NET Project :

由于是演示我就在Home的文件下新建一个视图Test.cshtml 相应的HomeController 添加如下代码:

1    public IActionResult Test()
2    {
3        return View();
5     }

在Models 文件夹里新建一个TestModel类:

1    public class TestModel
2     {
3         public int ID { get; set; }
4
5         public string Title { get; set; }
6     }

然后在 Models\IdentityModels.cs 文件的 ApplicationDbContext类中添加一句代码:

1 public DbSet<TestModel> TestItems { get; set; }

表示我们加了一张表在数据库中。但是现在运行肯定会报错,我们需要安装KVM。

二 安装 KVM(K version manager)

首先在管理员权限下运行cmd。然后把下面这句代码拷进去。

1 @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString(‘https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1‘))"

如果成功的话说明KVM安装成功了。

然后重新打开一个cmd 。输入 KVM upgrade  成功之后我们就可以做EF的迁移了。

 三 如何运行EF 数据库迁移

首先打开cmd 然后我们需要进入项目的当前目录:接下来运行  k ef migration add initial  k ef migration applay

ok 这样 ef 就迁移好了,我们会发现项目中多了一些东西

然后我们需要在Startup.cs 中的 Configure 方法中 添加如下代码:

1     app.UseServices(service =>
2             {
3                 service.AddEntityFramework()
4                           .AddSqlServer()
5                           .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(
6                               Configuration.Get("Data:DefaultConnection:ConnectionString")));
7             });

在HomeController 中部分代码:

 1    ApplicationDbContext context = new ApplicationDbContext();
 2
 3         public IActionResult Index()
 4         {
 5             return View();
 6         }
 7
 8         public IActionResult Test()
 9         {
10             context.Add(new TestModel() { Title = "test1" });
11
12
13             context.SaveChanges();
14
15             List<TestModel> list = context.Set<TestModel>().ToList();
16
17             return View(list);
18         }
19
20         protected override void Dispose(bool disposing)
21         {
22             base.Dispose(disposing);
23
24             context.Dispose();
25         }

Test.cshtml 文件代码:

 1 @model List<WebApplication3.Models.TestModel>
 2
 3 @{
 4     ViewBag.Title = "Test";
 5
 6 }
 7 <table class="table  table-hover table-bordered  table-condensed">
 8     <thead>
 9         <tr>
10             <th>ID</th>
11             <th>Title</th>
12         </tr>
13     </thead>
14     <tbody>
15         @foreach (var item in Model)
16         {
17         <tr>
18             <td>@item.ID</td>
19             <td>@item.Title</td>
20         </tr>
21         }
22
23     </tbody>
24 </table>

Ok 运行一下项目效果如下:

四 什么是 view component

作为Mvc6 新添加的东西和之前的partial view 还是比较类似的。但是要比partial view 更加的灵活和强大。和controller 和 view的关系一样是关注点分离的, component 相当于是一个mini的controller

它是去响应局部的模块而非是完整的。我们可以用view component 来解决更加复杂的页面上的问题。它有两部分组成 一个后台类和前台的Razor view (可以回掉后台类的方法)。

五 如何在 mvc 6 中添加一个view component

首先我在项目中新建一个ViewComponents的文件夹(这个文件夹名字可以随意命名),然后文件夹里新建一个 TestViewComponent 类 :

 1  public class TestViewComponent : ViewComponent
 2     {
 3         ApplicationDbContext context;
 4
 5
 6         public TestViewComponent(ApplicationDbContext context)
 7         {
 8             this.context = context;
 9         }
10
11         public IViewComponentResult Invoke(int max)
12         {
13             var item = context.Set<TestModel>().Where(p => p.ID > max).ToList();
14
15             return View(item);
16         }
17
18     }

然后我们需要添加一个 component  view 。在 Home文件夹新建Components(必须这样命名)文件夹然后 里面新建一个文件夹 Test(这个名字是和之前的那个TestComponent 相匹配的)

Test 文件夹里新建 一个视图,随意命名 default.cshtml

 1 @model List<WebApplication3.Models.TestModel>
 2 @{
 3     // ViewBag.Title = "Home Page";
 4 }
 5
 6 <h3>Priority Items</h3>
 7 <ul>
 8     @foreach (var item in Model)
 9     {
10         <li>@item.ID ----- @item.Title</li>
11     }
12 </ul>

那么我们就可以去调这个view component了 在Test.cshtml

 1 @model List<WebApplication3.Models.TestModel>
 2
 3 @{
 4     ViewBag.Title = "Test";
 5
 6 }
 7 <table class="table  table-hover table-bordered  table-condensed">
 8     <thead>
 9         <tr>
10             <th>ID</th>
11             <th>Title</th>
12         </tr>
13     </thead>
14     <tbody>
15         @foreach (var item in Model)
16         {
17         <tr>
18             <td>@item.ID</td>
19             <td>@item.Title</td>
20         </tr>
21         }
22
23     </tbody>
24 </table>
25
26 <div class="row">
27     @Component.Invoke("Test", 2);
28 </div>

Ok  看一下效果 :

那个view components 的意思是所有ID>2的列表。

六 如何在view 中注入一个服务 
 首先新建一个StaticService 类

 1  public class StatisticsService
 2     {
 3         private ApplicationDbContext db;
 4
 5         public StatisticsService(ApplicationDbContext db)
 6         {
 7             this.db = db;
 8         }
 9
10
11         public int GetCount()
12         {
13             return db.TestItems.Count();
14         }
15
16     }

然后Test.cshtml 代码:

 1 @model List<WebApplication3.Models.TestModel>
 2 @inject WebApplication3.Models.StatisticsService service
 3 <table class="table  table-hover table-bordered  table-condensed">
 4     <thead>
 5         <tr>
 6             <th>ID</th>
 7             <th>Title</th>
 8         </tr>
 9     </thead>
10     <tbody>
11         @foreach (var item in Model)
12         {
13         <tr>
14             <td>@item.ID</td>
15             <td>@item.Title</td>
16         </tr>
17         }
18
19     </tbody>
20 </table>
21
22 <div class="row">
23     @Component.Invoke("Test", 2);
24 </div>
25
26 <h1>
27    Total: @service.GetCount()
28 </h1>

在 startup.cs 中注册该类:

 1     public void ConfigureServices(IServiceCollection services)
 2         {
 3             // Add EF services to the services container.
 4             services.AddEntityFramework(Configuration)
 5                 .AddSqlServer()
 6                 .AddDbContext<ApplicationDbContext>();
 7
 8             // Add Identity services to the services container.
 9             services.AddDefaultIdentity<ApplicationDbContext, ApplicationUser, IdentityRole>(Configuration);
10
11             // Add MVC services to the services container.
12             services.AddMvc();
13
14             services.AddTransient<StatisticsService>();
15             // Uncomment the following line to add Web API servcies which makes it easier to port Web API 2 controllers.
16             // You need to add Microsoft.AspNet.Mvc.WebApiCompatShim package to project.json
17             // services.AddWebApiConventions();
18
19         }

运行 看效果:

七 总结

Mvc 6 还是加了不少的东西的,不过只会让以后的开发会原来越简单。

时间: 2024-08-02 05:53:05

Asp.net vNext 学习之路(二)的相关文章

Asp.net vNext 学习之路(三)

asp.net vNext 对于构建asp.net 程序带来了一些重大的改变,让我们开发asp.net 程序的时候更加的方便和高效. 1,可以很容易的去管理客户端的包比如jquery,bootstrap,angular. 2,能够自动的完成less 的编译,javascript 的压缩和单元测试. 3,在web 开发社区有非常丰富的工具生态系统. vs 2015 中有一些自动化的编译工具来支持一些第三方的工具, 1,Bower,可以看作是web 应用的包管理工具,bower 可以安装和恢复客户端

Asp.net vNext 学习之路(一)

概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新设计, asp.net vNext是一 个比较理想的选择对于构建现代Web应用程序来说.它为部署到云端或者运行在本地的应用程序提供了一个优化的开发框架,它的模块化组件以最小的 开销让你可以灵活地构建你的解决方案. asp.net vNext 包括以下几个特性: 1,新的灵活和跨平台的运行时. 2,新的模块化HTTP请求管道. 3,云计算环境的

java痛苦学习之路[二] ---JSONObject使用

一.Strut2必须引入的包 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar 4.commons-logging.jar 5.ezmorph.jar 6.json-lib-2.2.2-jdk15.jar 当然除了这些包,strut2基础包也得引入 struts2-core-2.1.6.jar freemarker-2.

[整理]ASP.NET vNext学习资源

http://www.hanselman.com/blog/IntroducingASPNETVNext.aspx http://blogs.msdn.com/b/dotnet/archive/2014/05/12/the-next-generation-of-net-asp-net-vnext.aspx#_.NET_vNext https://github.com/aspnet http://www.asp.net/vnexthttp://www.asp.net/vnext/overview/

zigbee学习之路(二):点亮LED

一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2530芯片却需要对IO口进行配置,才能对它进行赋值,需要配置的寄存器有PXSEL,PXDIR,PXINP,x可以代表任意IO口,如P1SEL. 下面介绍PXSEL的功能: 下面介绍PXDIR的功能: 下面介绍PXINP的功能: 通过配置以上寄存器的,就可以控制IO口德输入输出状态,是否做为普通IO口

ASP.NET MVC 学习之路-4

本文在于巩固基础 模型绑定 从URL 获取值 public ActionResult About(int id) { ViewBag.Id = id; return View(); } @{ ViewBag.Title = "About"; } <h2> @ViewBag.Id</h2> 后面还会说到Entity Framwork C# 的主要 Razor 语法规则 Razor 代码封装于 @{ ... } 中 行内表达式(变量和函数)以 @ 开头 代码语句以分

ASP.NET MVC 学习之路-1

本文在于巩固基础 学习参考书籍:ASP.NET MVC4 Web编程 首先确定我们学习MVC的目标: 我们学习ASP.NET MVC的目的在于开发健壮的.可维护的Web应用,当然这需要一定的知识基础,需要对HTML,CSS,JavaScript以及.net框架还有C#编程语言非常的熟悉 大概了解什么是ASP.NET MVC ASP.NET MVC他是一种全新的WEB开发框架,构建在.net平台上,ASP.NET MVC能够完全支持那些提倡松耦合,高可维护性的开发模式和实践原则 了解过去是为了更好

Android开发学习之路-二维码学习

这个月装逼有点少了,为什么呢,因为去考软件射鸡师了,快到儿童节了,赶紧写篇博纪念一下逝去的青春,唔,请忽略这句话. 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这样的,可以放心的扫,这只是我的博客主页链接啦: 关于QR码编码的二维码,我们要知道几个特点: 1. 扫描时可以从各个角度去扫,也就是旋转多少度都没关系,不信吗?下次去肯德基买单试试咯. 2. 二维码有容错率,容错率越大,生成的二维码也就越复杂,但是越不容易出错,并且,当二维码被遮挡的时候也越容易扫描

Python学习之路二

今天主要学习了列表,python的列表真的事太强大了,由于内容比较多,今天就先简单的介绍一下新学的几个成员函数吧. 首先我们要了解list是一种序列类型,其构造方式有四种形式: (1)空列表 [] (2)直接添加元素 [a] [a,b,c] (3)使用列表解析 [x for x in iterable] (4)使用构造函数 list() or list(iterable) 成员函数: append() 在末尾添加一个元素 extend() 以列表的形式在末尾添加 insert() 两个参数,第一