【问题标题】:.NET 4.5 WebForms: do I (still) really have to specify all 3 templates in a FormView?.NET 4.5 WebForms:我(仍然)真的必须在 FormView 中指定所有 3 个模板吗?
【发布时间】:2012-10-28 06:50:40
【问题描述】:

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

Scott Hanselman's example 的 WebForms 模型绑定(以及其他)中,我看到了在“编辑”模式下打开的 FormView 的使用,其中包含许多 DynamicControls 例如

<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 的 ItemTemplateEditItemTemplateInsertItemTemplate 将是相同的,除了 ItemTemplate 的控件将处于“只读”模式。

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

我很高兴使用 DynamicControls,但这里的团队永远不会采用 FormView 似乎需要的“3x 复制粘贴”方法,尤其是对于我们的大型模板。

我曾想过也许:

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

有什么例子/想法吗?

【问题讨论】:

    标签: asp.net webforms model-binding dynamic-controls asp.net-4.5


    【解决方案1】:

    不,您不必指定所有 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;
          }
      
      }
      

    【讨论】:

      【解决方案2】:

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

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

      通过这种方式,从不使用 ReadOnly 模式,因此不需要 ItemTemplate。 FormView 将使用 EditItemTemplate 进行编辑和插入。

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

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

      还要注意,FormView 的模式是在事件 SqlDataSource1_Selected 中确定的(参见该代码,带有 cmets)。

      我没有包含 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>
      
        Private Sub FormView1_ItemCommand(sender As Object, e As FormViewCommandEventArgs) Handles FormView1.ItemCommand
          Select Case FormView1.CurrentMode
            Case FormViewMode.Edit
              FormView1.UpdateItem(True)
            Case FormViewMode.Insert
              FormView1.InsertItem(True)
          End Select
        End Sub
      
        Private Sub SqlDataSource1_Selected(sender As Object, e As SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Selected
          If e.AffectedRows = 0 Then
            ' nothing exists yet, so make formview ready to insert
            FormView1.ChangeMode(FormViewMode.Insert)
          Else
            ' something exists already, so make formview ready to edit
            FormView1.ChangeMode(FormViewMode.Edit)
          End If
        End Sub
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-03
          • 2022-01-02
          • 2015-03-15
          • 2020-01-09
          • 2012-08-14
          相关资源
          最近更新 更多