asp.net core mvc View Component 应用

ViewComponent


1、View 组件介绍

在ASP.NET CORE MVC中,View组件有点类似于partial views,但是他们更强大,View组件不能使用model binding,当你调用它的时候仅仅依赖与你提供的数据
一个View组件特点:

   .呈现一大块而不是一个整体的响应。
   .包含在控制器和视图之间发现的相同的分离问题和可测试行优点。
   .可以包含参数和业务逻辑。
   .通常从布局页面调用。

你可以在任何可重复使用的渲染逻辑的部分视图中用视图组件来替换。

例如:

   .动态导航菜单

   .标签云

   .登陆面板

   .购物车

   .最近发表的文章

   .侧栏内容在一个典型的博客

   .登陆的面板信息可以显示在每一个页面上,并显示要注销或登陆的链接,具体取决于用户的登陆状态

   视图组件有两部分组成:类(通常派生自ViewComponent)和返回结果(通常为视图). 像控制器
   一样,视图组件可以是POCO,但大多数开发人员都希望利用从ViewComponent派生的方法和属性

 

2、创建一个View组件

本节包含创建一个视图组件。在本文的后面,我们将详细检查每个步骤并创建一个视图组件。

 2.1 、View Component类

   一个View组件的类可以通过下面方式创建:

   .继承ViewComponent
   .使用[ViewComponent]attribute 修饰的类,或者继承自一个[ViewComponent]attribute类的子类。
   .创建一个以ViewComponent结尾的类。

   像控制器一样,View组件必须是公共的、非嵌套的,和非抽象类。视图组件名称是删除"ViewComponent" 后缀的类名称。
   也可以使用ViewComponentAttribute.Name属性显式指定它。


2.2、View Component 类

      .支持构造函数注入
      .不参与控制器的生命周期,这意味着你不能在视图组件中使用过滤器

2.3、View Component方法

      视图组件在InvokeAsync方法中定义其逻辑,该方法返回IViewComponentResult.调用视图组件直接用参数,而不是模型
绑定。视图组件从不直接处理请求。通常,视图组件初始化模型,并通过调用View方法将其传递给视图。

   总是来说,视图组件方法如下:

   .定义一个InvokeAsync 方法返回一个IViewComponentResult
   .通常,通过调用ViewComponent View方法来初始化模型并将其传给视图。
   .参数来自调用方法,而不是HTTP,没有模型绑定
   .不能直接作为HTTP端点访问,他们是通过代码调用(通常在视图中)。视图组件从不处理请求。
   .在签名上重装,而不是来自当前HTTP请求的任何详细信息

2.4、View 搜索路径

   运行时View通过搜索下列路径:

   .Views/<controller_name>/Components/<view_component_name>/<view_name>

   .Views/Shared/Components/<view_component_name>/<view_name>

   创建视图组件结果或调用VIew方法时,可以指定不同的视图名称。

   我们建议你为视图文件命名为Default.cshtml,并使用Views/Shared/Components/<view_component_name>/<view_name>路径

   此示例中使用的PriorityList视图组件使用Views/Shared/Components/PriorityList/Default.cshtml作为视图组件视图。

   一个视图组件默认的名称是Default.cshtml 并且使用Views/Shared/Components/<view_component_name>/<view_name> 路径.
   
   在这个例子中我们使用PriorityList视图组件Views/Shared/Components/PriorityList/Default.cshtml

2.4、调用一个视图组件
   
   在View视图内通过如下调用视图组件:

   @Component.InvokeAsync("Name of view component", <anonymous type containing parameters>)

   参数将传递给InvokeAsync方法。在文章中开发的PriorityList视图组件是从Views/Todo/Index.cshtml视图中调用的。

   在下面,InvokeAsync方法调用两个参数:

   @await Component.InvokeAsync("PriorityList", new { maxPriority = 4, isDone = true })

  通过Tag Helper调用视图组件:

  对于asp.net core 1.1和更高版本,你可以作为tagHelper调用一个视图组件。

  <vc:priority-list max-priority="2" is-done="false">
  </vc:priority-list>

   上面代码中,PriorityList视图组件被转化成priority-list.视图组件的参被转化成小写短横线属性。

  调用视图组件的标签助手使用<vc> </ vc>元素。 视图组件指定如下:

  <vc:[view-component-name]
  parameter1="parameter1 value"
  parameter2="parameter2 value">
  </vc:[view-component-name]>

  注意: 为了使用View Component作为Tag Helper,必须使用@addTagHelper指令注册包含View Component的程序集。例如,

如果你的View Component位于名为"MyWebApp"的程序集,请将以下指令添加到_ViewImports.cshtml文件中:

  @addTagHelper *, MyWebApp

  本教程中使用的InvokeAsync方法:

   @await Component.InvokeAsync("PriorityList", new { maxPriority = 4, isDone = true })
  
   标签助手标记

   <vc:priority-list max-priority="2" is-done="false">
   </vc:priority-list>
   
  在上面的示例中,PriorityList视图组件成为priority-list。


  在Controller中直接调用一个组件

  视图组件通常从视图调用,但您可以直接从控制器方法调用他们。虽然视图组件不定义端点(如控制器),但你可以轻松
  实现返回ViewComponentResult内容的控制器操作。

   下面代码,View 组件直接通过控制器调用:

   public IActionResult IndexVC()
   { 
     return ViewComponent("PriorityList", new { maxPriority = 3, isDone = false });
   }

2.5、创建一个ViewComponent

  在代码中注意如下几点:

    .View Component 类能包含到项目任何目录下.

    .因为类名PriorityListViewComponent以ViewComponent结尾,运行时使用字符串"PriorityList"

    稍后将会做详细解释.

    .[ViewComponent]能改变名字引用一个ViewComponent。例如,我们可以命名XYZ类,并应用ViewComponent attribute
    
        [ViewComponent(Name = "PriorityList")]
        public class XYZ : ViewComponent{}

    .上面的[ViewComponent]特性告诉ViewComponent选择器使用名称为PriorityList 当视图查找相关联的组件时。

      并从视图引用类的组件时使用字符串"PriorityList"

    .组件使用了依赖注入,确保数据上下文是可用的。

    .InvokeAsync是公开的方法可以直接从视图中调用,它可以传入任意数量的参数。

    .InvokeAsync方法返回满足isDone和maxPriority参数的ToDo项集合

2.6、创建视图组件 Razor View

    .创建Views/Shared/Components 文件夹.这个文件夹的名字必须是Components。

    .创建Views/Shared/Components/PriorityList 文件夹,这个文件夹名称必须和ViewComponent类名称相同,或者类名减去后缀

     如果你使用了ViewComponet属性,则类名必须匹配该属性.
    
    .创建一个 Views/Shared/Components/PriorityList/Default.cshtml Razor view:


     @model IEnumerable<ViewComponentSample.Models.TodoItem>

    <h3>Priority Items</h3> 
   <ul>
    @foreach (var todo in Model)
    {
        <li>@todo.Name</li>
    }
    </ul> 

     Razor View 返回一个列表并显示他们.如果这个View Component 的InvokeAsync方法没有传递一个View的名字,根据契约Default视图名字将被使用。
     在稍后我们将介绍如何传递一个视图的名字, 要覆盖特定控制器的默认样式,请将视图添加到特定于控制器的视图文件夹(例如Views / Todo / Components / PriorityList / Default.cshtml)。
     将包含调用优先级列表组件的div添加到Views/Todo/index.cshtml文件的底部:

     <div >
      @await Component.InvokeAsync("PriorityList", new { maxPriority = 2, isDone = false })
     </div>  

      @await Component.InvokeAsync 展示了如何调用ViewComponent语法.第一个参数是我们想要调用视图组件的名称。后续参数传给组件,
      InvokeAsync可以接受任意数量的参数可以接受任何数量的参数。


      你也可以通过Controller直接调用。

       public IActionResult IndexVC()
       {
          return ViewComponent("PriorityList", new { maxPriority = 3, isDone = false });
       }
指定一个View名称

     复杂的视图组件有时候可能需要指定一些非默认视图。下面代码显示了如何从InvokeAsync方法中指定PVC视图。

更新PriorityListViewComponent类中的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);
}

 

     复制Views/Shared/Components/PriorityList/Default.cshtml文件,重命名为Views/Shared/Components/PriorityList/PVC.cshtml     
    

     在PVC.cshtml中添加下面代码:

    @{
       ViewData["Title"] = "Default";
       }
    @model IEnumerable<ViewComponentSimple.ViewComponents.TodoItem>

    <h3>To do PVC View</h3>

   <ul>
      @foreach (var todo in Model)
       {
          <li>@todo.Name</li>
       }
    </ul>

     运行应用程序,并验证PVC视图。

 


检查视图路径

     .将priority参数更改0,以便不返回PVC视图。
     .临时将Views/Todo/Components/PriorityList/Default.cshtml重命名为1Default.cshtml。

     .运行App你会得到下面错误:    
     

 

     .复制 Views/Todo/Components/PriorityList/1Default.cshtml 到 Views/Shared/Components/PriorityList/Default.cshtml.

     .向共享视图中添加一些标记,以指示视图来自共享文件。

     .测试共享文件中视图组件.

如果你想确保编译时类型安全,你可以用类名去替换硬编码(不用字符串).创建一个View视图不适用"ViewComponent" 后缀

 

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ViewComponentSample.Models;

namespace ViewComponentSample.ViewComponents
{
    public class PriorityList : ViewComponent
    {
        private readonly ToDoContext db;

        public PriorityList(ToDoContext context)
        {
            db = context;
        }

        public async Task<IViewComponentResult> InvokeAsync(
        int maxPriority, bool isDone)
        {
            var items = await GetItemsAsync(maxPriority, isDone);
            return View(items);
        }
        private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone)
        {
            return db.ToDo.Where(x => x.IsDone == isDone &&
                                 x.Priority <= maxPriority).ToListAsync();
        }
    }
}

使用nameof操作符:

@using ViewComponentSample.Models
@using ViewComponentSample.ViewComponents
@model IEnumerable<TodoItem>

<h2>ToDo nameof</h2>
<!-- Markup removed for brevity.  -->
    }
</table>

<div>

    @await Component.InvokeAsync(nameof(PriorityList), new { maxPriority = 4, isDone = true })
</div> 

原文:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/view-components 

原文地址:http://www.cnblogs.com/netcoder/p/7503876.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分离三位数

#include<stdio.h> main(){ int k,l,m,n;printf("请输入一个三位数"); scanf("%d",&k);lk/100;mk/10%10;nk%10;printf("这个三位数的百位是:%d\n",l);printf("这个三位数的十位是:%d\n",m);printf("这个三位数的个位是…

大湾区第二次.NET技术交流会圆满成功

2017年9月16日的深圳阳光明媚&#xff0c;一场为庆祝.NET Core 2.0发布和.NET 社区大会&#xff08;https://www.dotnetconf.net/&#xff09; 的召开的本地社区活动&#xff0c;这次活动还得到如鹏网杨中科老师的大力支持开通网上直播&#xff0c;网上有300多位参与活动&#…

五分钟轻松了解Hbase面向列的存储

转载自 五分钟轻松了解Hbase面向列的存储 说明&#xff1a;从严格的列式存储的定义来看&#xff0c;Hbase并不属于列式存储&#xff0c;有人称它为面向列的存储&#xff0c;请各位看官注意这一点。 行式存储 传统的数据库是关系型的&#xff0c;且是按行来存储的。如下图&a…

jeecg微服务项目调用接口报错Token验证失效的解决方法

大家好&#xff0c;我是雄雄。 前言 今天&#xff0c;记录一篇啼笑皆非的问题。 昨晚上在做微信公众号开发时&#xff0c;遇到了个解决好久的问题&#xff0c;即&#xff1a;微信公众号上配置服务器信息之后&#xff0c;回调服务器接口总是报错token验证失败。 剧透&#xf…

是时候开始用C#快速开发移动应用了

从2015年接触Xamarin到至今已经2个年头&#xff0c;我对Xamarin的技能没有长进多少&#xff0c;但它却已经足够成熟到在跨平台移动开发工具中占有一席之地。在扫了一些资料之后&#xff0c;突然发现国外有很多移动端的应用已经是用Xamarin开发&#xff0c;Telerik还有专门的团队…

十分钟理解负载均衡

转载自 十分钟理解负载均衡 开头先理解一下所谓的“均衡” 不能狭义地理解为分配给所有实际服务器一样多的工作量&#xff0c;因为多台服务器的承载能力各不相同&#xff0c;这可能体现在硬件配置、网络带宽的差异&#xff0c;也可能因为某台服务器身兼多职&#xff0c;我们…

输入一个字母,转大小写

用scanf完成 #include<stdio.h> main(){char m;scanf("%c",&m);if(m>a&&m<z){mm-32;}else if(m>A&&m<Z){m32;}printf("%c",m);}用getcahr完成 #include<stdio.h> main(){char m;mgetchar();if(m>a&&…

.net core 使用Redis的发布订阅

Redis是一个性能非常强劲的内存数据库&#xff0c;它一般是作为缓存来使用&#xff0c;但是他不仅仅可以用来作为缓存&#xff0c;比如著名的分布式框架dubbo就可以用Redis来做服务注册中心。接下来介绍一下.net core 使用Redis的发布/订阅功能。Redis 发布订阅Redis 发布订阅(…

MYSQL性能优化的最佳20+条经验

转载自 MYSQL性能优化的最佳20条经验 今天&#xff0c;数据库的操作越来越成为整个应用的性能瓶颈了&#xff0c;这点对于Web应用尤其明显。关于数据库的性能&#xff0c;这并不只是DBA才需要担心的事&#xff0c;而这更是我们程序员需要去关注的事情。当我们去设计数据库表结…

用数组选出最大的数并且排序

选出数组最大的值 #include<stdio.h> main(){//选出最大的 int a[5]{200,110,101,1010,5},i,max;maxa[0];for(i0;i<5;i){if(a[i]>max){maxa[i];}} printf("%d",max); }排序 #include<stdio.h> main(){//排序 int a[5]{200,110,101,1010,5},i,max…

java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现

大家好&#xff0c;我是雄雄&#xff0c;欢迎你的到来~ 前言 需求是这样的&#xff0c;当用户关注公司服务&#xff08;公众&#xff09;号时&#xff0c;就自动注册成为了会员&#xff0c;且通过小程序设置提醒&#xff0c;然后后台可以通过服务&#xff08;公众&#xff09;…

王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门

工欲善其事&#xff0c;必先利其器。上回书《王者荣耀是怎样炼成的&#xff08;一&#xff09;《王者荣耀》用什么开发&#xff0c;游戏入门&#xff0c;unity3D介绍》说到&#xff0c;开发游戏用到unity和C#。本篇博客将从零开始做一个unity的基础入门。\(^o^)/~欢迎大家的斧正…

史上最全MySQL 大表优化方案(长文)

转载自 史上最全MySQL 大表优化方案&#xff08;长文&#xff09; 当MySQL单表记录数过大时&#xff0c;增删改查性能都会急剧下降&#xff0c;可以参考以下步骤来优化&#xff1a; 一、单表优化 除非单表数据未来会一直不断上涨&#xff0c;否则不要一开始就考虑拆分&…

阶乘的值

#include<stdio.h> main(){//阶乘 int a,i,sum;printf("请输入你所需要的阶乘数&#xff1a;\n");scanf("%d",&a);sum1;for(i1;i<a;i){sumsum*i;} printf("%d",sum); } 输出阶乘的数

“.Net 社区大会”(dotnetConf) 2017 Day 1 Keynote: .NET Everywhere

8月份已经发布了.NET Core 2.0, 大会Keynote 一开始花了大量的篇幅回顾.NET Core 2.0的发布&#xff0c;社区的参与度已经非常高。大会的主题是.NET 无处不在&#xff1a;NET Core 2.0已经完成了服务端的布局&#xff0c;那么各种终端的覆盖就是Xamarin的主场&#xff0c;Xamar…

金三银四铜五铁六

转载自 金三银四铜五铁六 金三银四铜五铁六 据说&#xff0c;金三银四&#xff0c;截止今天为止面试黄金时间已经过去十之八九&#xff0c;而鲁班&#xff08;LB &#xff0c;以下全文均用LB代替&#xff09;恰逢是这批面试大军其中的一名小兵&#xff0c;很不幸今年恰逢遇…

WebSocket In ASP.NET Core

What Is WebSocket?WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;是建立在TCP上、且独立的协议。在WebSocket API 中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以进行持久性的连接&#xff0c;并进行双向数据传输。为了建立…

微信服务(公众)号实现用户关注自动注册成为会员

大家好&#xff0c;我是雄雄。交流技术可以进入到我的社区【雄雄的小课堂】 前言 看本篇文章之前&#xff0c;可以先看看前面两篇&#xff1a; java实现微信服务&#xff08;公众&#xff09;号用户关注时&#xff0c;获取openid&#xff0c;安全模式下的加密解密实现 微信公…

完成图片拖拽

<html> <head><meta charset"UTF-8"><title>拖拽</title><style type"text/css">#box1{width: 100px;height: 100px;background-color: yellow;position:absolute;}#box2{width: 100px;height: 100px;background-colo…

深入探索 Java 热部署

转载自 深入探索 Java 热部署 简介 在 Java 开发领域&#xff0c;热部署一直是一个难以解决的问题&#xff0c;目前的 Java 虚拟机只能实现方法体的修改热部署&#xff0c;对于整个类的结构修改&#xff0c;仍然需要重启虚拟机&#xff0c;对类重新加载才能完成更新操作。对…