博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net Core使用视图组件(ViewComponent)封装表单文本框控件
阅读量:6325 次
发布时间:2019-06-22

本文共 4081 字,大约阅读时间需要 13 分钟。

实例程序的界面效果如下图所示:

在表单中的搜索条件有姓名,学号,成绩。他们在一行中按照水平三等分排列。

在cshtml中用html实现上述表单效果的的代码如下:

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
View Code

 通过观察上述代码发现,搜索条件按照水平三等分排列会产生如下图红线标记的冗余代码:

通过截图可以看出,是否可以把这个div块封装成一个控件,这样就不用重复写样式属性,在使用时就只给lable,input控件根据实际情况赋予其相应的属性。

在.Net Core中视图组件(ViewComponent)可以完成这一功能。视图组件类似于部分视图,但是它们更强大。视图组件不使用模型绑定,只依赖于调用时提供的数据。

微软的官方帮助文档地址为:

创建视图组件(ViewComponent)

1.在解决方案根目录下创建ViewComponents文件夹,

   在ViewComponents文件夹下在添加子文件夹InputLabelTextBox,

   InputLabelTextBox文件夹下分别添加l类InputLabelTextBoxViewComponent.cs和InputLabelTextBoxViewModel.cs 结果如下图所示:

  

 

InputLabelTextBoxViewComponent.cs为视图组件类

1     public class InputLabelTextBoxViewComponent : ViewComponent 2     { 3         public IViewComponentResult Invoke(string labelText, string inputId, 4             string placehodler, string viewName) 5         { 6             //没有指定视图名称,默认使用Default.cshtml 7             if (string.IsNullOrEmpty(viewName)) 8             { 9                 viewName = "Default";10             }11             var fortmatDataViewModel = new InputLabelTextBoxViewModel(labelText, inputId, placehodler, viewName);12             return View(viewName, fortmatDataViewModel);13         }14     }
View Code

 InputLabelTextBoxViewModel.cs为视图组件中所用到的属性类,

 

1     public class InputLabelTextBoxViewModel 2     { 3         ///  4         /// Label控件的文本 5         ///  6         public string LabelText { get; set; } 7  8         ///  9         /// Input控件的Id10         /// 11         public string InputId { get; set; }12 13         /// 14         /// Input控件的水印15         /// 16         public string Placeholder { get; set; }17 18         /// 19         /// 视图名称20         /// 21         public string ViewName { get; set; }22 23         public InputLabelTextBoxViewModel(string labelText, string inputId, string placeholder, string viewName)24         {25             LabelText = string.IsNullOrEmpty(labelText) ? "" : labelText;26             InputId = string.IsNullOrEmpty(inputId) ? "" : inputId;27             Placeholder = string.IsNullOrEmpty(placeholder) ? "" : placeholder;28             ViewName = string.IsNullOrEmpty(viewName) ? "" : viewName;29         }30     }
View Code

 

2.在解决方案的Views文件夹下的Shared文件夹中添加Components子文件夹,

   在Components文件夹下在添加其子文件夹InputLabelTextBox,

   在文件夹中添加Default.cshtml视图,结果如下图所示:

Default.cshtml就是InputLabelTextBoxViewComponent.cs在界面上默认对应的视图。

1 @using TestViewComponent.ViewComponents2 @model InputLabelTextBoxViewModel3 4 
5
6
7
8
9
View Code

在About.cshtml页面中引用控件。

1 @{ 2     ViewData["Title"] = "About"; 3 } 4 
5 @using TestViewComponent.ViewComponents 6

分布视图实例:

7
8
9
10 @await Component.InvokeAsync(typeof(InputLabelTextBoxViewComponent), new {11 LabelText = "姓名",12 InputId = "InputName",13 Placeholder = "请输入姓名...",14 })15
16 @await Component.InvokeAsync("InputLabelTextBox", new17 {18 LabelText = "姓名1",19 InputId = "InputName1",20 Placeholder = "请输入姓名...",21 })22
23
View Code

 运行后的效果如图所示:

微软官方文档提供了调用视图组建两个方法,已经在上述代码中加以注释说明。

3.InputLabelTextBoxViewComponent对应多个cshtml页面

在上述例子中,InputLabelTextBoxViewComponent默认对应于Default.cshtml,现在又想创建第二个视图对应于InputLabelTextBoxViewComponent该怎么处理?

首先在InputLabelTextBox文件夹下创建DefaultOne.cshtml页面。

然后在调用视图组建时,把InputLabelTextBoxViewModel的ViewName属性的值赋成DefaultOne,这样在页面用引用的控件就对应于DefaultOne.cshtml。

源代码下载地址 : 

转载于:https://www.cnblogs.com/fengye310/p/10374576.html

你可能感兴趣的文章
注册谷歌帐号以及用其他镜像解决android sdk的下载问题(已解决)
查看>>
如何用Maven创建web项目(具体步骤)
查看>>
kdump启动失败如何配置
查看>>
我的友情链接
查看>>
【WOT】听2015年北京WOT互联网运维与开发者大会随记
查看>>
新手参考:Centos上安装MySQL社区版全过程
查看>>
ANDROID安全
查看>>
Pyenv安装及管理不同版本Python
查看>>
ISAKMP包头部结构
查看>>
1.创建springBoot项目
查看>>
LUA Learning Note 3: 表与函数
查看>>
linux关机命令详解(shutdown,halt,init)
查看>>
使用docker搭建zabbix
查看>>
浅析Windows7的睡眠、休眠、混合睡眠、离开模式
查看>>
C++ Primer Plus(六)——分支语句和逻辑运算符
查看>>
PHP使用curl替代file_get_contents
查看>>
storm shell命令源码分析-shell_submission.clj
查看>>
Hello World
查看>>
域策略事件错误ID 1030 ID 1058
查看>>
DataTable已属于另一个数据集
查看>>