kentico 12仅支持使用" form" page-builder widget的表单。
任何人都可以提供示例,说明如何在mvc _layout.cshtml或不使用页面构建器的页面上使用BizForms?
接受标准:
- 必须允许CMS用户编辑表单,并在网站上反映更改
- 必须允许开发人员在保存到Kentico之前并在发送通知/自动回复之前操纵/转换已提交的数据
- 必须正确渲染自定义表单和表单构建器中使用的自定义表单组件
OP发布了一个有关如何使此工作的博客。
该解决方案需要使用Kentico的某些内部API,以形式构建器构建器呈现窗口小部件并将该代码放入控制器操作中。
var formInfo = BizFormInfoProvider
.GetBizFormInfo(formName, SiteContext.CurrentSiteName);
string className = DataClassInfoProvider
.GetClassName(formInfo.FormClassID);
var existingBizFormItem = className is null
? null
: BizFormItemProvider
.GetItems(className)?.GetExistingItemForContact(
formInfo, contactContext.ContactGuid);
var formComponents = formProvider
.GetFormComponents(formInfo)
.GetDisplayedComponents(
ContactManagementContext.CurrentContact,
formInfo, existingBizFormItem, visibilityEvaluator);
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
TypeNameHandling = TypeNameHandling.Auto,
StringEscapeHandling = StringEscapeHandling.EscapeHtml
};
var formConfiguration = JsonConvert.DeserializeObject<FormBuilderConfiguration>(
formInfo.FormBuilderLayout, settings);
return new FormWidgetViewModel
{
DisplayValidationErrors = true,
FormComponents = formComponents.ToList(),
FormConfiguration = formConfiguration,
FormName = formName,
FormPrefix = Guid.NewGuid().ToString(),
IsFormSubmittable = true,
SiteForms = new List<SelectListItem>(),
SubmitButtonImage = formInfo.FormSubmitButtonImage,
SubmitButtonText = string.IsNullOrEmpty(formInfo.FormSubmitButtonText)
? ResHelper.GetString("general.submit")
: ResHelper.LocalizeString(formInfo.FormSubmitButtonText)
};
我提到了这个想法,并写了一个后续帖子,肯蒂科EMS:MVC小部件实验第3部分 - 渲染形式的构建器形式,没有小部件,这表明我们还可以使用肯蒂科的预构建的形式的窗口小部件视图代码,也可以获得预期的渲染。并形成提交功能。
<!-- ~/Views/Form/Form.cshtml -->
@using Kentico.Forms.Web.Mvc;
@using Kentico.Forms.Web.Mvc.Widgets;
@using Kentico.Forms.Web.Mvc.Widgets.Internal
@model FormWidgetViewModel
@{
var config = FormWidgetRenderingConfiguration.Default;
// @Html.Kentico().FormSubmitButton(Model) requires
// this ViewData value to be populated. Normally it
// executes as part of the Widget rendering, but since
// we aren't rendering a Widget, we have to do it manually
ViewData.AddFormWidgetRenderingConfiguration(config);
}
@using (Html.Kentico().BeginForm(Model))
{
@Html.Kentico().FormFields(Model)
@Html.Kentico().FormSubmitButton(Model)
}
使用以下视图结构的组合和视图模型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
中的方法更新或添加表单提交并发送电子邮件。
update(请参阅注释):
IFormBuilderConfigurationRetriever
标记为internal
,因此无法直接访问。它的实现依次使用IFormBuilderConfigurationSerializer
进行formInfo.FormBuilderLayout
。该接口也标记为internal
。此外,该接口的实现使用internal
FormBuilderTypesBinder
。
这意味着没有可用的API检索Model.FormConfiguration
。从肯蒂科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,您可以用户表单API(https://docs.kentico.com/api12/content-management/form-data)保存/访问表单数据并为其实现完全自定义的布局。希望有帮助!
您可以查看MVC项目中的Kentico.Forms.Web.Mvc.Widgets
名称空间(默认情况下应包含在内)。
中有一个KenticoFormWidgetController
控制器类,该类使形成部分并接受表单。您可能会使用该控制器的索引路由来渲染您的表格的部分,但是我不知道该路线的外观。
如果您对肯蒂科的源代码访问访问权限,则可以自己检查它的内部。