Asp.net .NET4.5WebForms:我(仍然)真的必须在FormView中指定所有3个模板吗?

Asp.net .NET4.5WebForms:我(仍然)真的必须在FormView中指定所有3个模板吗?,asp.net,webforms,model-binding,dynamic-controls,asp.net-4.5,Asp.net,Webforms,Model Binding,Dynamic Controls,Asp.net 4.5,调查ASP.NET 4.5 WebForms中新的强类型模型绑定方法: 在WebForms模型绑定中(除其他外),我看到使用了以“编辑”模式打开的FormView,其中包含许多动态控件,例如 <asp:FormView runat="server" ID="MyForm" ... DefaultMode="Edit"> <EditItemTemplate> <asp:DynamicControl runat="server" ID="Field1" Da

调查ASP.NET 4.5 WebForms中新的强类型模型绑定方法:

在WebForms模型绑定中(除其他外),我看到使用了以“编辑”模式打开的FormView,其中包含许多
动态控件
,例如

<asp:FormView runat="server" ID="MyForm" ... DefaultMode="Edit">
  <EditItemTemplate>
    <asp:DynamicControl runat="server" ID="Field1" DataField="Field1" Mode="Edit" />
    <asp:DynamicControl runat="server" ID="Field2" DataField="Field2" Mode="Edit" />
  </EditItemTemplate>
</asp:FormView> 

在我的情况下,我的FormView的
ItemTemplate
EditItemTemplate
InsertItemTemplate
将是相同的,只是ItemTemplate的控件将处于“只读”模式

我(仍然)真的需要在FormView中提供三个几乎相同的模板副本吗

我很乐意使用DynamicControl,但这里的团队永远不会采用FormView似乎需要的“3倍复制粘贴”方法,特别是对于我们的大型模板

我想也许:

  • DynamicControl是否可以从包含的FormView中获取其“模式”
  • 我可以使用FormView以外的其他东西来包含我的DynamicControl
  • 我是否应该在代码隐藏中管理DynamicControl模式以避免模板重复

有任何示例/想法吗?

只需设置AutoGenerateEditButton=“true”。项目模板中的所有输入类型都将可编辑。
您可能必须使用jQuery显示/隐藏文本框和其他输入类型的边框

否,您不必指定所有3个模板。我也遇到过同样的情况,这是我的解决方案:

  • 将默认模式设置为最常用的模式
  • 然后在表单的代码隐藏中管理表单模式
  • 在“代码隐藏”中,将您手工编码的模板(例如EditTemplate)复制到所需的另一个模板

    protected void Page_Init()
    {
        var action = RouteData.Values["action"].ToString();
    
        switch (action)
        {
            case "add":
                personForm.ChangeMode(FormViewMode.Insert);
                this.Page.Title += " Add";
                break;
            case "edit":
                personForm.ChangeMode(FormViewMode.Edit);
                this.Page.Title += " Change";
                break;
            default:
                personForm.ChangeMode(FormViewMode.ReadOnly);
                break;
        }
    
        // Reuse inserttemplate for editing
        if (personForm.CurrentMode == FormViewMode.Edit)
        {
            personForm.EditItemTemplate = personForm.InsertItemTemplate;
        }
    
    }
    

与许多人的想法相反,在FormView中,您只需要一个模板,即EditItemTemplate

下面是一个简单的例子,展示了如何做(请注意,这与“动态数据”的概念无关)

通过这种方式,永远不会使用只读模式,因此不需要ItemTemplate。FormView将使用EditItemTemplate进行编辑和插入

这种方法大大简化了标记,当您对布局进行调整时,只需在一个模板中进行调整

请注意,“保存”按钮没有CommandName。相反,该命令是在FormView1_ItemCommand事件中确定的(请参见代码)

还请注意,FormView的模式是在事件SqlDataSource1_Selected中确定的(请参阅该代码,并附上注释)

我没有包括SqlDataSource1的标记,因为您不需要为该标记考虑任何特殊情况。照常做就行了

    <asp:FormView ID="FormView1" runat="server" DataSourceID="SqlDataSource1"
      DataKeyNames="ApplicationId,UserId"
    >
      <EditItemTemplate>
        <asp:TextBox ID="txtFirstName" runat="server" Text='<%# Bind("firstName") %>'></asp:TextBox><br />
        <asp:TextBox ID="txtAge" runat="server" Text='<%# Bind("age") %>'></asp:TextBox><br />
        <asp:Button ID="btnSave" runat="server" Text="Save" />  
      </EditItemTemplate>
    </asp:FormView>