Sitecore form submit API

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上找到.