6

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

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

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

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

我曾想过也许:

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

任何例子/想法?

4

3 回答 3

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;
        }
    
    }
    
于 2014-05-23T12:39:27.070 回答
1

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

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

在这种方式下,从不使用 ReadOnly 模式,因此不需要 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>
  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
于 2018-03-09T13:57:08.283 回答
0

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

于 2013-05-02T04:24:19.307 回答