Sitecore form作为Sitecore内置的一个模块后, 它经常被用于创建一些简单的表单. 比如联系我们, 留言等等.
在MVC模式下因为Sitecore已经提供了现成的rendering, 使用中并没有什么太多的问题. 主要的扩展集中在Submit action, customized field type 等等.
但是在多平台的情况下, 因为一些平台本身的限制可能没办法直接使用Sitecore提供的API, 这时你就需要创建一个新的API来实现数据保存的功能.
如果仅仅是保存数据, 你也可以直接访问数据库, form模块的数据库总共就3张表,结构很简单.
还有一种方案就是模拟Sitecore form的submit过程, 这样的好处在于:
- 所有的submit action都会执行
- 不仅仅只是保存数据
- 如果你设置了验证, 那这些验证也同样会被执行. 不需要你再实现一套验证
forms.getModel pipeline
pipeline会返回一个IViewModel实例, 包含了指定field的ID, 名称, 类型以及相关的设置. 比如Css Class, 验证信息等等.
var args = new GetModelEventArgs() { ItemId = fieldId };
var fieldViewModel = PipelineService.Get().RunPipeline<GetModelEventArgs, IViewModel>("forms.getModel", args, (Func<GetModelEventArgs, IViewModel>)(a => a.ViewModel));
IValidatableField
对于那些接受数据的form element, 同样实现了这个接口. 使用这个接口可以进行数据验证.
if (fieldViewModel is IValidatableField validatableField)
{
if (validatableField.Validations?.Any() ?? false)
{
foreach (var validationElement in validatableField.Validations)
{
var validateResult = validationElement.Validate(fieldData.Value);
}
}
}
IFormSubmitHandler
使用它就可以触发 指定的按钮的submit action.
var formSubmitContext = new FormSubmitContext(buttonId)
{
FormId = formId,
PageId = pageId,
SessionId = Guid.NewGuid(),
RobotDetectionEnabled = false,
Fields = viewModels.ToList()
};
this.formSubmitHandler.Submit(formSubmitContext);
buttonId, formId, pageId可以从Sitecore form对应的item上找到.