一、组成:

一个视图组件包括两个部分,派生自ViewComponent的类及其返回结果。类似控制器。

定义一个视图组件,如控制器一样,必须是公开,非嵌套,非抽象的类。一般,视图组件名称为类名去掉”ViewComponent“后缀。也可通过ViewComponentAttribute.Name属性进行明确指定。

二、视图组件方法:

在InvokeAsync/Invoke方法中定义逻辑,并返回IViewComponentResult。参数可直接来源于视图组件间调用,通过匿名类属性进行传递。

三、视图组件搜索路径:

运行时对视图搜索路径如下:

Views/Components/

Views/Shared/Components

视图组件默认名称为Default,通过可默认命名为Default.cshtml;或可指定视图名称,在调用View方法返回时,将名称一同返回。

四、视图组件调用:

1.从视图中调用

@Component.Invoke("视图组件名",<匿名类型参数>)。或@await Component.InvokeAsync("视图组件名",<匿名类型参数>)。

2.从控制器直接调用:

直接在Action中返回,return ViewComponent("视图组件名称", new {arg0=xx,arg1=xxx});的形式调用。

五、简单示例:

通过创建一个视图组件,返回前n个标识,进行显示。

视图组件类:(则该视图名称为”TopTags“)

namespace ViewComponentAbout.Components
{
public class TopTagsViewComponent : ViewComponent
{
private readonly ITagService _tagService; public TopTagsViewComponent(ITagService tagService)
{
_tagService = tagService;
} public IViewComponentResult Inovke(int count)
{
var tags = _tagService.LoadTopTags(count);
var models = tags.Select((tag) =>
new TagViewModel
{
Id = tag.Id,
Name = tag.Name
});
return View(models);
} public async Task<IViewComponentResult> InvokeAsync(int count)
{
var tags = await _tagService.LoadTopTagsAsync(count);
var models = tags.Select((tag) =>
new TagViewModel
{
Id = tag.Id,
Name = tag.Name
});
return View(models);
}
}
}

数据来源Services:

namespace ViewComponentAbout.Services
{
public interface ITagService
{
IEnumerable<Tag> LoadTopTags(int count);
Task<IEnumerable<Tag>> LoadTopTagsAsync(int count);
}
} namespace ViewComponentAbout.Services
{
public class TagService : ITagService
{
private static Func<List<Tag>> _tags = () =>
{
var tags = new List<Tag>();
for (int i = ; i < ; ++i)
{
tags.Add(new Tag { Id = $"No.{i}", Name = $"Tag{i}", Description = "Tag entity", CreatedOn = DateTime.Now });
}
return tags;
}; public IEnumerable<Tag> LoadTopTags(int count)
{
return _tags().Take(count);
} public async Task<IEnumerable<Tag>> LoadTopTagsAsync(int count)
{
return await Task.Run(() => _tags().Take(count));
}
}
}

实体:

namespace ViewComponentAbout.Entities
{
public class Tag
{
public string Id { get; set; }
public string Name { get; set; }
public DateTime CreatedOn { get; set; }
public string Description { get; set; }
}
}

ViewModel:

namespace ViewComponentAbout.ViewModels
{
public class TagViewModel
{
public string Id { get; set; }
public string Name { get; set; }
}
}

视图组件页面:(位于/Views/Shared/Components/TopTags/Default.cshtml

@model IEnumerable<ViewComponentAbout.ViewModels.TagViewModel>

<style>
ul li {color:purple;font-style:italic;}
</style> @if(Model.Any())
{
<ul>
@foreach(var tag in Model)
{
<li>
[@tag.Id] @tag.Name
</li>
}
</ul>
}

Startup中,在ConfigureServices添加服务注入:

services.AddSingleton<ITagService, TagService>();

在Index.cshtml页面中,使用如下:

@await Component.InvokeAsync("TopTags", new { count =  })

效果:


创建一个命名视图组件:

获取前10个Tag数据,如:(视图名:Top10Tags)

namespace ViewComponentAbout.Components
{
public class Top10TagsViewComponent : ViewComponent
{
private readonly ITagService _tagService; public Top10TagsViewComponent(ITagService tagService)
{
_tagService = tagService;
} public IViewComponentResult Inovke()
{
var tags = _tagService.LoadTopTags();
var models = tags.Select((tag) =>
new TagViewModel
{
Id = tag.Id,
Name = tag.Name
});
return View("TagComponentName", models);
} public async Task<IViewComponentResult> InvokeAsync()
{
var tags = await _tagService.LoadTopTagsAsync();
var models = tags.Select((tag) =>
new TagViewModel
{
Id = tag.Id,
Name = tag.Name
});
return View("TagComponentName", models);
}
}
}

组件视图页面:(位于 /Views/Shared/Components/Top10Tags/TagComponentName.cshtml

@model IEnumerable<ViewComponentAbout.ViewModels.TagViewModel>

<style>
ul li {color:purple;font-style:italic;}
</style>
There is only 10 tags in the component.
@if(Model.Any())
{
<ul>
@foreach(var tag in Model)
{
<li>
[@tag.Id] @tag.Name
</li>
}
</ul>
}

调用:

@await Component.InvokeAsync("Top10Tags")

效果:

asp.net core视图组件(ViewComponent)简单使用的更多相关文章

  1. Asp.Net core 视图组件ViewComponent

    视图组件 ViewComponent 最近用了一下视图组件,还挺方便的,如果遇到公共的部分,可以抽出来,写成视图组件,方便调用 先上图看一下效果:比如首页的4个画红框的地方是4个模块,有些地方可能要重 ...

  2. [转]asp.net core视图组件(ViewComponent)简单使用

    本文转自:http://www.cnblogs.com/dralee/p/6170496.html 一.组成: 一个视图组件包括两个部分,派生自ViewComponent的类及其返回结果.类似控制器. ...

  3. asp.net core 视图组件(转)

    介绍视图组件 视图组件是 ASP.NET Core MVC 中的新特性,与局部视图相似,但是它们更加的强大.视图组件不使用模型绑定,只取决于调用它时所提供的数据.视图组件有以下特点: 渲染一个块,而不 ...

  4. 笔记: ASP.NET Core视图组件

    视图组件 asp.net core mvc 提供了部分视图的新替代品:视图组件. 视图组件与分布视图的主要区别在于视图组件与控制器不相关.可使用在独立于单个控制器的场景,如:菜单导航.侧边栏.分页栏等 ...

  5. asp.net core 视图组件化

    视图组件可以通过partial view或viewcomponent实现 partialview https://docs.microsoft.com/zh-cn/aspnet/core/mvc/vi ...

  6. .Net Core使用视图组件(ViewComponent)封装表单文本框控件

    实例程序的界面效果如下图所示: 在表单中的搜索条件有姓名,学号,成绩.他们在一行中按照水平三等分排列. 在cshtml中用html实现上述表单效果的的代码如下: <form class=&quo ...

  7. ASP.NET Core 视图 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 视图 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 视图 花了几章节,终于把 ASP.NET Core MVC 中的 C 控 ...

  8. ASP.NET CORE 自定义视图组件(ViewComponent)注意事项

    *红色字体为固定命名,蓝色为一般命名规则,黄色为ASP.NET CORE 默认查找文件名 概要:1.简单ViewComponent的用法 2.ViewComponent控制器返回值  3.注意事项 1 ...

  9. Blazor入门:ASP.NET Core Razor 组件

    目录 关于组件 组件类 静态资产 路由与路由参数 组件参数 请勿创建会写入其自己的组参数属性的组件 子内容 属性展开 任意参数 捕获对组件的引用 在外部调用组件方法以更新状态 使用 @ 键控制是否保留 ...

随机推荐

  1. 在Main方法中设置异常的最后一次捕捉

    在做Winfrom程序时,有时会遇到一个异常,可是这个异常不知道在什么地方发生的,程序会自动关闭,然后什么也没有了,在网上找到了一种方法,用来捕捉这种异常. 出现这种情况的原因是在程序中某些地方考虑不 ...

  2. EBS 11i 的工作流列表

    总帐模块(GL) GIS(Global Intercompany System)通知 GL自动分配 GL成批分配流程 GL分配流程 GL过帐流程 GL经常性日记帐流程 PA分配组流程 日记帐审批 应付 ...

  3. 微信小程序与传统APP十大优劣对比

    随着微信公众平台的开放,微信端小程序涌现市场,带来很很多便利和简单的原生操作,询:微信端小程序是否会替代传统的APP应用?两者的优劣如何?我们一起来看看传统APP与微信端小程序十大优劣对比       ...

  4. 07-本地 YUM 源制作

    1.YUM相关概念 1.1.什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基 ...

  5. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

  6. Error:failed to find Build Tools revision 23.0.0 rc3

    解决,选择AS里有的版本就可以了,已有的我这就一个23.0.3,导入的项目是23.0.2 Donate:)

  7. filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )

    很多时候需要将图片显示在网页上,一般都会这样做,如下: <img src="xxx.jpg"/> 是的,这样是可以做到,但是如果我要将本地的图片显示到页面上呢?你可能会 ...

  8. 一段SQL

    如何将会计分录流水合并成会计分录,环境oracle 11g,代码如下: 表: CREATE TABLE "DEMO_VCH" ("SET_NO" BYTE), ...

  9. NVelocity

    迭代内置对象:  velocityCount 集合数   :  count NVelocity遇到不能处理的引用时,一般会直接输出标签名称. 在$符号后加个!号,出现Null时,标签的内容就会显示空白 ...

  10. andriod刷机

    有句古话叫常在河边走,难免会翻船.对于经常刷机的Android刷友来说,难免会碰到刷机失败损坏recovery程序乃至手机无法启动的情况,也就是传说中的手机变砖块.不过刷机失败手机变砖并不是世界末日, ...