Kentico 12仅支持使用“表单”页面构建器小部件开箱即用的表单。
任何人都可以提供如何在MVC _Layout.cshtml或不使用页面构建器的页面中使用BizForms的示例吗?
验收标准:
使用以下视图结构和视图模型FormWidgetViewModel
的组合呈现表单窗口小部件:
using (Ajax.Kentico().BeginForm( ... ))
{
@Html.AntiForgeryToken()
@Html.Kentico().FormFields(Model.FormComponents, Model.FormConfiguration, FormFieldRenderingConfiguration.Widget)
// Render Model.SubmitButtonImage using @Html.Kentico().ImageInput( ... )
// Or render a plain <input> using Model.SubmitButtonText
}
如果您有表单的BizFormInfo
对象,则需要以下属性:
new FormWidgetViewModel
{
FormName = formInfo.FormName,
FormConfiguration = IFormBuilderConfigurationRetriever.Retrieve(formInfo),
FormComponents = IFormProvider.GetFormComponents(formInfo).GetDisplayedComponents( ... ),
FormPrefix = // This may be optional outside of the Page Builder context,
SubmitButtonText = formInfo.FormSubmitButtonText,
SubmitButtonImage = formInfo.FormSubmitButtonImage
}
在Ajax.Kentico().BeginForm
内部,您可以传递控制器和处理表单的操作。
使用IFormProvider
中的方法更新或添加表单提交并发送电子邮件。
更新(见评论):
IFormBuilderConfigurationRetriever
标记为internal
,因此无法直接访问。它的实现反过来使用IFormBuilderConfigurationSerializer
反序列化formInfo.FormBuilderLayout
。该界面也标记为internal
。此外,该接口的实现使用internal
FormBuilderTypesBinder
。
这意味着没有可用于检索Model.FormConfiguration
的API。从Kentico 12.0.16开始,您需要重新创建内部功能。基本实现是这样的:
JsonConvert.DeserializeObject<FormBuilderConfiguration>(formInfo.FormBuilderLayout, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
TypeNameHandling = TypeNameHandling.Auto,
SerializationBinder = // Set to the internal FormBuilderTypesBinder, which validates only known form builder types
StringEscapeHandling = StringEscapeHandling.EscapeHtml
});
Hades,您可以使用Forms API(https://docs.kentico.com/api12/content-management/form-data)来保存/访问表单数据并为其实现完全自定义的布局。希望有所帮助!
您可以查看MVC项目中的Kentico.Forms.Web.Mvc.Widgets
命名空间(默认情况下应该包含它)。
在有一个KenticoFormWidgetController
控制器类,它呈现部分形式并接受表单提交。您可以使用该控制器的索引路径来渲染表单的一部分,但是我不知道路径的确切位置。
如果你有Kentico的源代码访问权限,你可以自己检查它的内部。