当前位置: 移动技术网 > IT编程>开发语言>.net > Asp.net vNext 学习之路(二)

Asp.net vNext 学习之路(二)

2018年02月13日  | 移动技术网IT编程  | 我要评论

tvbfuns,纪维克,苏霞沉沦

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

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>

 

 

 

四 什么是 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 <p class="row">

27     @Component.Invoke("Test", 2);

28 </p>

 

 

 

 

 

那个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 <p class="row">

23     @Component.Invoke("Test", 2);

24 </p>

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         }

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网