• ASP.NET Core-扩展Views的几种方式


    在新的ASP.NET Core 中,那些你熟悉的方式有一部分仍然能用,只是Core版本针对视图又添加了一些东西。

    Layout(布局):

    位于 ViewsShared 文件夹里 。通常情况下这个文件通常包含HTML的header,body和公用的一些东西。你可以多建几个互相进行组合,来完成整个站点的布局。

    有时候子视图中想在布局视图中显示一部分html代码,比如javascript代码或者是css,这个时候就可以使用Sections,Layout中定义 @RenderSection("scripts", required: false) ,子视图中使用 @section scripts{/*........*/} 

    ViewImports(全局视图):

    可以在全局视图中配置你其他视图中使用的一些比较公用的 using 引用,依赖注入等。

    PartialView(分部视图):

    你可以提取html页面中重用的部分,把它放到一个新的Razor视图中,这个视图没有自己的Action,这种视图就叫做分部视图。 分部视图通常也在ViewsShard文件夹。

    分部视图同样也可以是一个数据视图,它可以从父视图中获取数据。例:在视图中引用分部视图 @{ await Html.RenderPartialAsync("Users", Model.Users);} 

    ViewComponent(视图组件):

    MVC Core中新增了视图组件,用于显示页面可重用功能,包含代码、视图。组件必须包含在页面中,不能单独显示,类似以前的用户控件。

    有时候你需要做一些分部视图的事情,但是又包含一些业务逻辑在里面。在过去,你可以使用ChildAction渲染结果到一个视图中,但是,在 ASP.NET Core中,有一种新的方式来做这件事情,它就是ViewComponent

    与MVC5.0中的Html.RenderAction类似,区别是RenderAction性能差,会走Cotroller生命周期,如滤器会执行一遍。

    与MVC5.0中的Html.RenderPartial区别是RenderPartial中业务数据依赖Action,ViewComponent业务数据不依赖Action,有自己的后台代码提供

    @Component.Invoke("Top10Articles");

    参考文章:

    https://www.cnblogs.com/shenba/p/6629212.html
    https://www.cnblogs.com/powertoolsteam/p/4212740.html

    HtmlHelper:

    在Core中比HTMLHelpers扩展更好的是新的TagHelpers,但是在扩展你视图的时候,HTMLHelpers仍然有它自己的一些适用的地方。

    TagHelper:

    MVC Core中的新功能,用来代替MVC版本的HtmlHelper,用来辅助生成html标记。

    在ASP.NET Core MVC中你应该使用 TagHelpers 来替换 HtmlHelpers,因为它们更加的简洁和容易使用。另一个巨大的好处就是依赖注入,在HtmlHelpers中是使用不了的,因为HtmlHelpers 扩展的都是静态内容。

    但TagHelpers是一个公共类,我们可以很容易的在它的构造函数中注入服务。

    利用自定义标记赋予元素功能或添加属性的方式,跟Angular有点类似。

    案例:

    [HtmlTargetElement("nav-li")]
        public class NavTagHelper : TagHelper
        {
            public string Step { get; set; }
            public string Current { get; set; }
            public string Text { get; set; }
    
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                //output.Attributes.SetAttribute("class", $"btn btn-{BsButtonColor}");
                string _class = "breadcrumb__item--current";
                var content = new StringBuilder();
                _class = this.Step == this.Current ? "breadcrumb__item--current" : "breadcrumb__item--completed";
                content.Append($"<span class='breadcrumb__text' aria-current='step'>{this.Text}</span>");
                output.TagName = "li";
                output.Attributes.Add("class", $"breadcrumb__item {_class}");
                if (this.Current != ECheckoutStep.Pay.GetText())
                {
                    content.Append(@"<svg class='icon-svg icon-svg--color-adaptive-light icon-svg--size-10 breadcrumb__chevron-icon' aria-hidden='true' focusable='false'><use xlink:href='#chevron-right'><svg id='chevron-right'><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'><path d='M2 1l1-1 4 4 1 1-1 1-4 4-1-1 4-4'></path></svg></svg></use></svg>");
                }
    
                output.Content.SetHtmlContent(content.ToString());
            }
        }
    View Code
    <ul class="breadcrumb breadcrumb--center">
                <nav-li step="@ViewBag.Step" current="@ECheckoutStep.Cart" text="Cart">
                </nav-li>
                <nav-li step="@ViewBag.Step" current="@ECheckoutStep.Info" text="Information">
                </nav-li>
                <nav-li step="@ViewBag.Step" current="@ECheckoutStep.Ship" text="Shipping">
                </nav-li>
                <nav-li step="@ViewBag.Step" current="@ECheckoutStep.Pay" text="Payment">
                </nav-li>
            </ul>
    View Code

    参考文章:

    https://www.cnblogs.com/shenba/p/6637259.html
    https://www.cnblogs.com/shenba/p/6697024.html

    未完待续...

  • 相关阅读:
    在cmd命令行中弹出Windows对话框
    Windows远程桌面连接如何直接使用剪贴板功能
    升级Windows10后Apache服务器启动失败的解决方法
    Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决
    手动构建Servlet项目的流程
    更改Apache默认网站根目录
    windows下安装Appserv等php套件之后无法进入数据库管理的问题
    Java web项目的字符集问题
    五谷-小米:白小米
    五谷-小米:黑小米
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12247708.html
Copyright © 2020-2023  润新知