是否可以使用数据填充Episerver.Forms字段

时间:2017-01-18 12:09:00

标签: episerver episerver-forms

我正在使用Episerver 10和Episerver.Forms插件。我创建了一个包含多个字段的表单。我想知道是否可以选择使用数据预填充这些字段。

实施例: 电子邮件地址字段。如果用户已登录,我希望此字段将用户配置文件中的电子邮件设置为值。

我为电子邮件创建了自己的自定义字段,但我尝试使用SetDefaultValues方法,但显然它意味着不同的东西。

修改

我的自定义表单字段:

public class PostalCodeFormField : TextboxElementBlock
{
    public override void SetDefaultValues(ContentType contentType)
    {
        base.SetDefaultValues(contentType);
        base.PredefinedValue = "Hello world";
    }
}

该字段的模板:

@model My.Valid.Namespace.PostalCodeFormField
<div class="Form__Element FormTextbox" data-epiforms-element-name="@Model.FormElement.ElementName">
    <label for="@Model.FormElement.Guid">
        My label
    </label>
    <p>@Model.PredefinedValue</p>
    <input type="text" name="@Model.FormElement.ElementName" class="FormTextbox__Input" id="@Model.FormElement.Guid" value="@Model.PredefinedValue" />
    <span data-epiforms-linked-name="@Model.FormElement.ElementName" class="Form__Element__ValidationError" style="display: none;">*</span>
</div>

事件@Model.PredefinedValue为空,如SetDefaultValues从未被称为

3 个答案:

答案 0 :(得分:2)

如果您不想创建自定义元素(但我认为这是最佳解决方案),您可以更改元素的视图。它应位于:\ modules \ _protected \ EPiServer.Forms \ Views \ ElementBlocks

对于您的电子邮件示例,我会将TextboxElementBlock.ascx更改为以下内容:

<%@ import namespace="System.Web.Mvc" %>
<%@ import namespace="EPiServer.Web.Mvc.Html" %>
<%@ import namespace="EPiServer.Forms.Core.Models" %>
<%@ import namespace="EPiServer.Forms.Helpers" %>
<%@ import namespace="EPiServer.Forms.Implementation.Elements" %>
<%@ Import Namespace="EPiServer.Personalization" %>
<%@ control language="C#" inherits="ViewUserControl<TextboxElementBlock>" %>

<%
    var formElement = Model.FormElement;
    var labelText = Model.Label;
    var isEmailField = formElement.Validators.Any(x => x is EPiServer.Forms.Implementation.Validation.EmailValidator);
    var defaultValue = Model.GetDefaultValue();
    if (isEmailField)
    {
        defaultValue = EPiServerProfile.Current.Email;
    }
%>

<div class="Form__Element FormTextbox <%: Model.GetValidationCssClasses() %>" data-epiforms-element-name="<%: formElement.ElementName %>">
    <label for="<%: formElement.Guid %>" class="Form__Element__Caption"><%: labelText %></label>
    <input name="<%: formElement.ElementName %>" id="<%: formElement.Guid %>" type="text" class="FormTextbox__Input"
        placeholder="<%: Model.PlaceHolder %>" value="<%: defaultValue %>" <%: Html.Raw(Model.AttributesString) %> />

    <span data-epiforms-linked-name="<%: formElement.ElementName %>" class="Form__Element__ValidationError" style="display: none;">*</span>
    <%= Model.RenderDataList() %>
</div>

修改

没看到你编辑问题。从SetDefaultValues中的base.PredefinedValue中删除“base”,它应该可以工作。

public class PostalCodeFormField : TextboxElementBlock
{
    public override void SetDefaultValues(ContentType contentType)
    {
        base.SetDefaultValues(contentType);
        PredefinedValue = "Hello world";
    }
}

要设置“动态值,您可以向该类添加新属性(在此处获取当前用户电子邮件):

  public virtual string UserEmail => EPiServerProfile.Current != null ? EPiServerProfile.Current.Email : string.Empty;

并更新视图中的输入:

<input type="text" name="@Model.FormElement.ElementName" class="FormTextbox__Input" id="@Model.FormElement.Guid" value="@Model.UserEmail" />

答案 1 :(得分:1)

它是,但不是开箱即用。我们通常通过创建自定义元素来解决此问题。

David Knipe在此撰写了一篇精彩的博客https://www.david-tec.com/2016/01/building-out-a-custom-form-element-with-the-new-episerver-forms/

检查表单模型

public override void SetDefaultValues(ContentType contentType)
{
    base.SetDefaultValues(contentType);

    // override
    base.PredefinedValue = "Hello world";
}

答案 2 :(得分:0)

新的Episerver表格Autofill API可以帮助您完成这项工作。