NETCore入门系列(自定义IHtmlHelper、TagHelper、PartialView和ViewComponent)

一、创建ASP.NET Core Web 项目

1、创建一个ASP.NETCore Web应用(模型-视图-控制器),并将其命名为RazorWebApp
在这里插入图片描述
在这里插入图片描述
2、视图渲染(项目运行后,发现修改视图内容后,刷新没效果,需要重新启动才生效,此时可通过添加一个nuget包解决)
(1)添加一个名为Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation的nuget包。
在这里插入图片描述

(2)在startup.cs中添加该组件到管道中,代码如下:

 services.AddRazorPages().AddRazorRuntimeCompilation();

二、自定义IHtmlHelper

1、如下图,分别创建UtilsRazorExtension文件夹,并在该文件夹中创建一个名为HtmlHelperExtensions类。
在这里插入图片描述
2、将HtmlHelperExtensions设置为静态类,并在其中分别创建BrImg方法,这两个方法是自定义扩展类,其中当Br方法被调用时,当前html会出现"换3行"的代码;Img方法扩展了html中的img标签,调用该扩展方法,会在当前html页面上生成一个img标签。

public static class HtmlHelperExtensions
    {
        /// <summary>
        /// 构建一个换3行的扩展方法
        /// </summary>
        /// <param name="helper"></param>
        /// <returns></returns>
        public static IHtmlContent Br(this IHtmlHelper helper)
        {
            return new HtmlString("</br></br></br>");
        }

        /// <summary>
        /// 扩展img方法
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="src"></param>
        /// <returns></returns>
        public static IHtmlContent Img(this IHtmlHelper helper,string src)
        {
            return new HtmlString($"<img src='{src}'/>");
        }


    }

3、将项目中默认的Index.cshtml内容做如下更改

@{
    ViewData["Title"] = "Home Page";
}
<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>

    <h2>IHtmlHelper</h2>
    @Html.Br()
    @Html.Img("你的图片所在路径")
 </div>

4、运行项目,F12可看到当前html中有3个br标签和一个img标签输出,其中img中图片是在百度找的。
在这里插入图片描述

三、自定义TagHelper

1、在RazorExtension目录中创建一个名为StudentTagHelper类。
2、该类代码如下:

//1、标记当前tag元素的名称,如果不标记,则默认使用当前去掉“TagHelper”的类名
[HtmlTargetElement("student")]
    public class StudentTagHelper:TagHelper
    {
        //2、定义一个Age字段,前端使用该标签时可给该属性传值
        public int Age { get; set; }
		
		//3、重写Process
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            // base.Process(context, output);
            output.TagName = "div";//对应的html标签
            output.Attributes.Add("id","007");//标签中的属性
            output.Attributes.Add("name","007");
            output.Attributes.Add("age",Age);
            output.PreContent.SetContent("扩展TagHelper输出的内容!");//当前标签的内容
        }
    }

3、在Index,cshtml中添加如下代码,此时会发现页面上并没有输出一个"扩展TagHelper输出的内容!"的div标签,原因是未在_ViewImports.cshtml中引入自定义TagHelper的命名空间。

 <h2>TagHelper</h2>
    <student age="18"></student>
    <hr />

4、找到_ViewImports.cshtml,并在其中添加"@addTagHelper *, RazorWebApp"代码,这段代码的意思是引入当前项目RazorWebApp中所有自定义的taghelper,完整代码如下:

@using RazorWebApp
@using RazorWebApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, RazorWebApp

5、重新启动项目,可看到自定义的TagHelper可正常输出内容。
在这里插入图片描述

四、局部视图(PartialView)的使用

1、在Views/Home目录下创建一个名为PartialView.cshtml视图文件,并向其中添加如下代码:

<h1>这是局部视图</h1>
<p style="color:deepskyblue">局部视图的内容</p>

2、在Index.cshtml中添加如下代码,引入上一步中创建的视图文件。

  @await Html.PartialAsync("PartialView") 

3、运行项目,可看到界面中输出PartialView.cshtml的内容,如下图:

五、视图组件(ViewComponent)的使用

1、在Utils目录下创建一个名为ViewComponentExtension的目录,并在其中创建一个名为StudentViewComponent类。
在这里插入图片描述
2、StudentViewComponent.cs的代码如下:

[ViewComponent(Name ="StudentList")] //1、自定义组件名,如果没有设置,则会取StudentViewComponent中的"Student"为组件名
    public class StudentViewComponent: ViewComponent  //2、继承ViewComponent类
    {
        /// <summary>
        /// 3、定义异步的InvokeAsync方法,它是返回组件内容的方法,这里的方法类似控制器中的方法
        /// </summary>
        /// <returns></returns>
        public async Task<IViewComponentResult> InvokeAsync()
        {
            ViewBag.UserName = "007";//用户名
            var list = await GetStudents();
            return View(list);
            //return View("~/Views/Shared/Components/StudentList/Default.cshtml",list);  //可自定义返回的cshtml路径
        }

        /// <summary>
        /// 4、获取学生数据
        /// </summary>
        /// <returns></returns>
        public Task<List<Student>> GetStudents()
        {
            return Task.Run(() =>
            {
                return new List<Student>()
                {
                    new Student(){ Id=1,Name="小明"},
                    new Student(){ Id=2,Name="小红"},
                    new Student(){ Id=3,Name="小兰"},
                    new Student(){ Id=4,Name="小李"},
                    new Student(){ Id=5,Name="小王"},
                    new Student(){ Id=6,Name="小刚"},
                };
            });
        }
    }

    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

3、在Views/Shared目录中创建Components/StudentList目录,并在该目录中创建一个名为Default.cshtml视图文件(这是视图组件默认"return view()"指向的视图文件地址)
4、Default.cshtml视图文件的代码如下:

@using RazorWebApp.Utils.ViewComponentExtension;
@model List<Student>

<h2>CurUser:@ViewBag.UserName</h2>

@foreach (var item in Model)
{
<h3>用户_@item.Id:@item.Name</h3>
}

5、在Index.cshtml中添加如下代码(引用自定义的视图组件):


    <br />
    @await Component.InvokeAsync("StudentList")
    <hr />

6、运行项目,可看到浏览器中正确输出如下内容:
在这里插入图片描述

六、源码

https://gitee.com/wusuoweixgy/NET5Code/tree/master/RazorWebApp

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值