表单构建器
表单构建器可以构建常用的表单, 并支持多种表单字段和客户端+服务端验证.
默认构建的表单都会带CSRF校验值, 防止跨站攻击.
表单构建器的种类
基础插件中提供了多个种类的表单构建器, 可以按需要使用.
FormBuilder
- 最原始的表单构建器, 需要把字段一个个添加到
FormBuilder.Fields
- 绑定使用
BindValues
或BindValuesFromAnonymousObject
- 提交使用
ParseValues
- 最原始的表单构建器, 需要把字段一个个添加到
ModelFormBuilder
- 支持从类型和成员的属性构建表单
- 绑定使用
Bind
, 类型同时需要提供OnBind
函数 - 提交使用
Submit
, 类型同时需要提供OnSubmit
函数
EntityFormBuilder
- 基于
ModelFormBuilder
, 可以根据url请求中的id函数获取和保存对象 - 注意这个构建器自身不会进行权限的检查, 使用前需要自己检查或通过过滤器检查
- 绑定使用
Bind
, 类型同时需要提供OnBind
函数 - 提交使用
Submit
, 类型同时需要提供OnSubmit
函数
- 基于
TabFormBuilder
FormBuilder
的多标签版本, 根据字段属性的Group
划分标签
TabModelFormBuilder
ModelFormBuilder
的多标签版本, 根据字段属性的Group
划分标签
TabEntityFormBuilder
EntityFormBuilder
的多标签版本, 根据字段属性的Group
划分标签
FieldsOnlyFormBuilder
- 只描画字段, 不提供绑定和提交功能的构建器, 可以用于嵌入字段到现有的表单
FieldsOnlyModelFormBuilder
- 同
FieldsOnlyFormBuilder
, 支持从类型和成员的属性构建
- 同
使用表单构建器的例子
这里的例子使用了ModelFormBuilder
.
添加控制器
添加src\Controllers\FormExampleController.cs
[ExportMany] public class FormExampleController : ControllerBase { [Action("example/form")] [Action("example/form", HttpMethods.POST)] public IActionResult Form() { var form = new ExampleForm(); if (Request.Method == HttpMethods.POST) { return new JsonResult(form.Submit()); } else { form.Bind(); return new TemplateResult("zkweb.examples/form.html", new { form }); } } }
添加表单
添加src\UIComponents\Forms\ExampleForm.cs
Required
和StringLength
属性需要引用System.ComponentModel.DataAnnotations
程序集.
public class ExampleForm : ModelFormBuilder { [Required] [StringLength(100)] [TextBoxField("Name", "Please enter name")] public string Name { get; set; } [Required] [TextBoxField("Age", "Please enter age")] public int Age { get; set; } protected override void OnBind() { Name = "Tom"; Age = 25; } protected override object OnSubmit() { var message = string.Format("Hello, {0} ({1})", Name, Age); return new { message }; } }
添加模板文件
添加templates\zkweb.examples\form.html
{% use_title "Example Form" %} {% include common.base/header.html %} <div class="portlet"> {{ form }} </div> {% include common.base/footer.html %}
效果
自定义提交地址等参数
表单构建器支持自定义提交地址等参数, 使用ModelFormBuilder
时可以给表单类型添加Form
属性.
[Form("ExampleForm", "/example/form", "POST", SubmitButtonText = "Submit this form")] public class ExampleForm : ModelFormBuilder { }
提供的表单字段
基础插件提供了以下表单字段类型,
需要更多表单字段类型可以添加自定义的属性并注册IFormFieldHandler
到容器.
LabelFieldAttribute(string name)
- 文本字段, 不可编辑
TextBoxFieldAttribute(string name, string placeHolder = null)
- 标准的文本框
PasswordFieldAttribute(string name, string placeHolder = null)
- 标准的密码框
TextAreaFieldAttribute(string name, int rows, string placeHolder = null)
- 标准的多行文本框
CheckBoxFieldAttribute(string name)
- 勾选按钮, 样式默认使用Switchery
CheckBoxGroupFieldAttribute(string name, Type source)
- 勾选按钮组, 会把选中按钮的值通过同一个字段提交, 格式是json
CheckBoxGroupsFieldAttribute(string name, Type source)
- 多个勾选按钮组, 会把选中按钮的值通过同一个字段提交, 格式是json
CheckBoxTreeFieldAttribute(string name, Type source)
- 勾选按钮树, 会把选中按钮的值通过同一个字段提交, 格式是json
DropdownListFieldAttribute(string name, Type source)
- 标准的下拉框
SearchableDropdownListFieldAttribute(string name, Type source)
- 可搜索的下拉框, 只支持搜索
select
下的值, 不支持远程搜索
- 可搜索的下拉框, 只支持搜索
RadioButtonsFieldAttribute(string name, Type sources)
- 单选按钮组
FileUploaderFieldAttribute(string name, string extensions = null, int maxContentsLength = 0)
- 文件上传控件, 要求字段是 IHttpPostedFile
- 需要自己处理上传后的文件
FileUploaderAsUrlFieldAttribute(string name, string extensions = null, int maxContentsLength = 0)
- 文件上传控件, 要求字段是 string, 会存放上传后的文件Url
HiddenFieldAttribute(string name)
- 隐藏字段
JsonFieldAttribute(string name, Type fieldType)
- Json隐藏字段, 会自动序列化和反序列化
HtmlFieldAttribute(string name)
- 显示指定的Html的字段, 仅用于显示, 提交时无值
RichTextEditorAttribute(string name, string config)
- 富文本编辑器
- 需要引用其他插件实现, 默认插件集中的CMS.CKEditor实现了这个字段