zoukankan      html  css  js  c++  java
  • 在ASP.NET Core中使用ViewComponent

    前言

    在之前的开发过程中,我们对于应用或者说使用一些小的组件,通常使用分布页(partial view),再往前在Web Form中我们会进行应用WEB Control,好吧提及一个关键性代码TagPrefix:TagName,通过这种的标记我们便可以在我们web form中进行引入我们的组件,当然自从.NET MVC之后呢,就已经没有了WebControl,而对于.NET Core后,又多了一个特性ViewComponent

    对于ViewComponent看起来它类似于小的控制器,而对于我们小的组件或者小部分通用型功能,可通过ViewComponent进行实现,比如说留言栏、菜单等等。

    ViewComponent是由两部分组成,一部分是类(通常该类集成与ViewComponent),而另外一部分是视图(Razor和普通的View一样),当然ViewComponent同样也支持POCO,不继承ViewComponent,但类名以ViewComponent结尾。

    自定义一个组件

    创建ViewComponent的方式有三种,如下所示:

    • 继承自ViewComponent
    • 使用ViewComponent特性
    • 创建一个类,以ViewComponent结尾

    需要注意的是View Component必须是公共的(public),非嵌套,非抽象类。

    对于View Component我们有了一个基本的认识,下面的话创建一个ButtonViewComponent示例,作为我们的参考:

    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    
    namespace ViewComponentDemo.ViewComponents
    {
        public class ButtonViewComponent : ViewComponent
        {
            public async Task<IViewComponentResult> InvokeAsync()
            {
                return View();
            }
        }
    }
    
    

    在视图页面中调用该组件:

    @await Component.InvokeAsync("Button")
    

    对于ViewComponent同样也是跟Controller一样,进行通过我们服务端特性进行视图操作,再或者说渲染,比如下面我们要传递参数,进行修改我们的Button的样式:

    我们修改一下原方法,同时增加一个Enum类型,进行样式的选择

    @await Component.InvokeAsync("Button",ButtonType.Success)
    
     public async Task<IViewComponentResult> InvokeAsync(ButtonType type = ButtonType.Success)
     {
            ViewBag.Type = type;
            //return View("name",model);//允许强类型
            return View();
     }
     
        public enum ButtonType
        {
            Default,
            Primary,
            Success,
            Info,
            Warning,
            Danger,
            Link
        }
    

    ViewComponent特性

    因为在我们的视图关系绑定中,我们更多的是依赖于命名式绑定,而当我们组件的命名与类命名不一致时,会导致我们搜索不到相关的视图,当然我们可能会在使用过程中对其应用不一样的Name,而对于这种情况,我们可以使用ViewCompoentAttribute
    进行标记,通过这种方式我们可进行视图的绑定,如下所示:

        [ViewComponent(Name ="Button")]
        public class ButtonTest : ViewComponent
        {
            public async Task<IViewComponentResult> InvokeAsync(ButtonType type = ButtonType.Success)
            {
                ViewBag.Type = type;
                return View();
            }
        }
    

    如上代码虽然ButtonTest的命名引发了视图绑定失败(不能进行使用Button),而我们将其加入一个标记,将Name命名为Button这样弥补了我们命名的不一致行为。

    Taghelper方式

    通过@addTagHelper指定进行注册包含组件的程序集,组件位于ViewComponentDemo程序集中

    @addTagHelper *, ViewComponentDemo
    

    通过如下内容,我们便可以进行直接引用我们的视图,相对来说这种方式看起来美观一些。

    切记这种方式有一个弊端,参数不是可选性参数,也就是你必须把每一个参数都进行显示的调用一下,否则将导致搜索不到.

    <vc:button type="@ButtonType.Success"></vc:button>
    

    在如上代码中type为我们的方法参数。

    Reference

    Demo:https://github.com/hueifeng/BlogSample/tree/master/src/ViewComponentDemo

    https://www.cnblogs.com/TomXu/p/4496486.html

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

  • 相关阅读:
    JS 删除web sql 数据表
    JS 新建web sql 数据表
    JS 更新web sql 数据表的数据
    JS 删除一行web sql 数据表的数据
    JS 向web sql数据表插入数据
    JS 打开or连接web sql数据库
    JS 获取表单数据存入数组
    JS 限制小数点位数
    JS 通过id获取DOM对象--减少代码
    mvc “System.NullReferenceException”类型的异常在 App_Web_zo44wdaq.dll 中发生,但未在用户代码中进行处理 其他信息: 未将对象引用设置到对象的实例。
  • 原文地址:https://www.cnblogs.com/yyfh/p/14640402.html
Copyright © 2011-2022 走看看