.Net Core使用视图组件(ViewComponent)封装表单文本框控件

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

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

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

 1 <form class="form-horizontal" role="form">
 2     <div class="row">
 3         <div class="form-group col-md-4">
 4             <label for="name" class="col-md-2 control-label">姓名</label>
 5             <div class="col-md-10">
 6                 <input type="text" class="form-control" id="name" placeholder="请输姓名">
 7             </div>
 8         </div>
 9         <div class="form-group col-md-4">
10             <label for="name" class="col-md-2 control-label">学号</label>
11             <div class="col-md-10">
12                 <input type="text" class="form-control" id="name" placeholder="请输学号">
13             </div>
14         </div>
15         <div class="form-group col-md-4">
16             <label for="name" class="col-md-2 control-label">成绩</label>
17             <div class="col-md-10">
18                 <input type="text" class="form-control" id="name" placeholder="请输成绩">
19             </div>
20         </div>
21     </div>
22     <button type="submit" class="btn btn-default">搜索</button>
23 </form>

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

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

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

微软的官方帮助文档地址为:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.2

创建视图组件(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     }

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

 1     public class InputLabelTextBoxViewModel
 2     {
 3         /// <summary>
 4         /// Label控件的文本
 5         /// </summary>
 6         public string LabelText { get; set; }
 7
 8         /// <summary>
 9         /// Input控件的Id
10         /// </summary>
11         public string InputId { get; set; }
12
13         /// <summary>
14         /// Input控件的水印
15         /// </summary>
16         public string Placeholder { get; set; }
17
18         /// <summary>
19         /// 视图名称
20         /// </summary>
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     }

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

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

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

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

 1 @{
 2     ViewData["Title"] = "About";
 3 }
 4 <!--引入命名空间-->
 5 @using TestViewComponent.ViewComponents
 6 <h2>分布视图实例:</h2>
 7 <form class="form-horizontal" role="form">
 8     <div class="row">
 9         <!--使用类型创建-->
10         @await Component.InvokeAsync(typeof(InputLabelTextBoxViewComponent), new {
11            LabelText = "姓名",
12            InputId = "InputName",
13            Placeholder = "请输入姓名...",
14        })
15         <!--InputLabelTextBox为InputLabelTextBoxViewComponent.cs去掉ViewComponent后的名字-->
16         @await Component.InvokeAsync("InputLabelTextBox", new
17        {
18            LabelText = "姓名1",
19            InputId = "InputName1",
20            Placeholder = "请输入姓名...",
21        })
22     </div>
23 </form>

运行后的效果如图所示:

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

3.InputLabelTextBoxViewComponent对应多个cshtml页面

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

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

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

原文地址:https://www.cnblogs.com/fengye310/p/10374576.html

时间: 2024-10-10 06:21:11

.Net Core使用视图组件(ViewComponent)封装表单文本框控件的相关文章

(三)关于kendo IU表单form各类控件的数据绑定

=====================input textarea============================= <div id="view"> <input data-bind="value: inputValue" /> <textarea data-bind="value: textareaValue"></textarea> </div> <script&g

Html5之基础-9 HTML表单、其他控件、其他常用标记

一.表单概述 表单的作用 (1) 表单用于显示.收集信息,并提交信息到服务器 (2) 表单有两个基本部分 - 实现数据交互的可见的界面元素,比如文本框或按钮 - 提交后的表单处理 (3) 页面元素 - 使用 <form> 元素创建表单 - 在 <form> 元素中添加其他表单可以包含的控件元素 如图: 表单元素 <form> (1) 定义表单:使用成对的 <form></form>标记 (2) 主要属性 - action:  定义表单被提交时发生

[转]html5表单上传控件Files API

表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:<input type="file" multiple> 只允许上传一个文件:<input  type="file" single> 2.上传指定的文件格式 <input type="file" accept="im

响应式的账号登录界面模板完整代码,内置form表单和js控件

响应式的账号登录界面模板,内置form表单和js控件 1 <!DOCTYPE html> 2 <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 3 4 <link type="text/css" rel="styleSheet"

深入浅出ExtJS 第四章 表单与输入控件(未完)

1 4.1 制作表单 2 var form = new Ext.form.FormPanel({ 3 title:'form', 4 defaultType:'textfield', 5 buttonAlign:'center', 6 frame:true, 7 width:220, 8 fieldDefaults:{ 9 labelAlign:'right', 10 labelWidth:70 11 }, 12 tiems:[{ //子组件; 13 fieldLabel:'文本框' //文本框

Extjs4——表单与输入控件

1.表单的简单形式: var form = new Ext.form.FormPanel({ title: 'form', defaultType: 'textfield', buttonAlign: 'center', frame: true, width: 220, fieldDefaults: { labelAlign: 'right', labelWidth: 70 }, items: [{ fieldLabel: '文本框' }], buttons: [{ text: '按钮' }]

[Swift通天遁地]二、表格表单-(15)自定义表单文本框内容的格式

本文将演示如何设置表单中的输入内容的格式. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 现在开始编写代码,实现设置表单中的输入内容的格式. 1 import UIKit 2 //首先在当前类文件中, 3 //引入以及安装的第三方类库 4 import Eureka 5 6 //创建一个货币类,该类继承自数学格式类,并遵循格式化协议. 7 class CurrencyFormatter : NumberFormatter, FormatterProtocol

表单 -文本框之前或之后添加文本或按钮

样式: *现代浏览器的最新版都支持inline-block,只有ie6.7不支持inline-block,但ie6.7可以通过 display:inline:zoom:1:来模拟. *firefox,safari,opera,ie8+中的 inline-block 元素之间会莫名其妙多出3px的间距,其实这个是换行符,可以在inline-block的父元素中加上 font-size:0:来去掉inline-block元素之间的空隙. *white-space: nowrap;   设置如何处理元

PHP+JavaScript+HTML实现注册界面表单及日历控件

本文主要是介绍我做PHP网站时的一个HTML的简单静态界面,它的主要功能是用户注册界面,并且参照了网上的例子使用JavaScript判断和My97DatePicker的日历控件.界面效果如下图所示: 同时插入数据库显示效果如下图所示: 可以看到引用My97DatePicker的日历控件及判断效果如下图所示:    其中注册界面register_student.html代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona