如何将现有用户控件转换为 Kentico Web 部件?

How do I convert an existing usercontrol to a Kentico Web Part?

我有一个现有的用户控件"BigForm.ascx":

<%@ Control 
    Language="C#" AutoEventWireup="true" 
    CodeFile="BigForm.ascx.cs" Inherits="BigForm" %>

<asp:Panel runat="server" DefaultButton="btnSubmit">
    <%--SUPER COMPLICATED FORM--%>
    <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
</asp:Panel>

BigForm.ascx 非常复杂 - 它动态地向占位符添加子控件,它封装了大量的业务逻辑,标记是高度定制的,等等。

我可以使用 "User Control" web 部件将 BigForm.ascx 添加到 Kentico,它工作得很好。

但是如果我将 BigForm.ascx 转换为 "proper" Web 部件 - 通过从 CMSAbstractWebPart 而不是从 UserControl 继承 - 不会触发回发。我将单击提交按钮,但没有任何反应。

我在 designing forms using the form builder 上看到了 Kentico doco,但是这个用户控件已经可以完美运行了,而且我怀疑使用 WYSIWIG 构建它太复杂了。更不用说我非常喜欢使用 Visual Studio.

构建表单

我的理解是,使用 Web 部件是 "correct" 与 Kentico 相关的事情,这样做会让用户在该 Web 部件上指定属性(例如,如果我们想翻译表单将来 - 我们可以在 Web 部件上放置 "First Name label text",用户可以放置 "Vorname" 而不是 "First name")。

我需要做什么才能将有效的用户控件转换为 Kentico Web 部件?

首先,如果它没有损坏就不要修复它,除非您正在寻找或需要在您的控制中有更多的多样性。如果您的复杂控件使用用户控制 web 部件运行良好,并且您不准备使用 Kentico 的开箱即用功能,那么我建议坚持使用用户控制 web 部件,因为它可以工作。

如果您有兴趣详细了解如何创建 Web 部件、它们的生命周期与标准用户控件有何不同以及如何使您的控件更具动态性,那么 read this documentation

您会注意到的一个重大差异是存在 Page_Load 事件但使用不多。使用 OnContentLoaded 事件,它发生在标准 asp.net OnInit 事件之前。这是您设置所有 属性 值并加载数据的地方。按钮事件确实发生在 Page_Load 事件之后,就像在标准表单中一样。就像标准的 asp.net 一样,任何动态加载的控件都需要在每个 post 后面是 reloaded/created。保存数据的控件也需要绑定到每个 post 上。这并不意味着您必须再次检索数据,因为缓存引擎很棒,这意味着控件必须有一个 DataSet 分配给它,而不是有条件地加载。学习 look at this example 如何在 Kentico 中加载缓存数据。

关于构建表单,是的,它在 Visual Studio 中运行良好,没有分歧,尽管当您必须手动创建和处理所有 CRUD 操作与简单地捕获这些事件时,无论是在您的 Web 部件中还是globally,它使构建变得更容易、更动态、更健壮和更快。

作为 Kentico 的长期开发人员,确实需要一点时间才能摆脱您 需要 从头开始​​开发所有内容的心态。在许多情况下,您使用的工具(在本例中为 Kentico)已经为您正在做或需要做的事情创建了标准控件。或者,如果您有一个复杂的解决方案,将其分解成更小的部分并创建更小的用户控件并将它们动态加载到您的 Web 部件中效果很好。

祝你工作顺利!

Form documentation
Working with Form Data using API