在ASP.NET中自定义编辑记录的最佳方法?

时间:2020-03-05 18:39:59  来源:igfitidea点击:

我来自Rails背景,并且在ASP.NET项目(不是ASP MVC)上做一些工作。新手问题:为记录表创建自定义编辑器的最简单方法是什么?

例如:我有一堆数据行,并且想要更改每个数据行上的"类别"字段-可能是一个下拉列表,一个链接,或者是用户键入了它。

在Rails中,我将遍历行以构建表,并且每行都有一个表单。该表单将具有一个输入框或者下拉列表,并将数据提交到控制器,例如" / item / edit / 15?category = foo",其中15是itemID,新类别是" foo"。

我是ASP.NET模型的新手,不确定执行此操作的"正确"方法-只是获取新数据并将其保存的最简单方法。我会做一个自定义控件并将其添加到每一行吗?任何帮助表示赞赏。

解决方案

回答

有一些控件可以为我们做到这一点,其复杂程度取决于它们的相对灵活性。

传统的方法是使用DataGrid控件,该控件为我们提供表格布局。如果我们想要外观更灵活的东西,DataList和ListView控件还内置了对编辑,插入或者删除字段的支持。

查看Matt Berseth的博客,了解一些出色的asp.net控件实际示例。

回答

如今,我们可以真正作弊,并看看.NET 3.5 SP1附带的新动态数据。 Scott Guthrie的博客条目演示了如何在这里为我们快速便捷地进行操作:

http://weblogs.asp.net/scottgu/archive/2007/12/14/new-asp-net-dynamic-data-support.aspx

在没有获得最前沿优势的情况下,我将使用XSD生成器来生成与所讨论表一致的强类型数据集。这还将生成TableAdapter,可用于执行所有CRUD语句。

从那里,将其绑定到DataGrid并利用与其相关的所有标准模板/事件,例如EditIndex,SelectedIndex,RowEditing,RowUpdated等。

从.NET的1.0天初期开始,我就一直在这样做,并且随着Framework的每次更新,这种功能都变得越来越精简。

编辑:我也想对Matt Berseth博客也点头。我已经关注他很多东西了,这太好了!

回答

谢谢你们的答案。看起来,自定义DataGrid是可行的方法。对于任何ASP.NET新手,这就是我正在做的事情

<asp:DataGrid ID="GridView1" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundColumn DataField="RuleID" Visible="False" HeaderText="RuleID"></asp:BoundColumn>
        <asp:TemplateColumn HeaderText="Category">
        <ItemTemplate>
            <!-- in case we want to display an image -->
            <asp:Literal ID="litImage" runat="server">
            </asp:Literal>
            <asp:DropDownList ID="categoryListDropdown" runat="server"></asp:DropDownList>
         </ItemTemplate>
        </asp:TemplateColumn>

    </Columns>
</asp:DataGrid>

这将创建一个数据网格。然后,我们可以将其绑定到数据源(本例中为DataTable),并使用类似

foreach (DataGridItem item in this.GridView1.Items)
{
     DropDownList categoryListDropdown = ((DropDownList)item.FindControl("categoryListDropdown"));
     categoryListDropdown.Items.AddRange(listItems.ToArray());
}

在数据网格中填充初始下拉列表。在这种情况下,我们还可以访问item.Cells [0] .text以获取RuleID。

自己注意:ASP.NET模型在代码隐藏文件中执行所有操作。在较高级别,我们始终可以遍历GridView1.Items以获取每一行,还可以遍历item.findControl(" ControlID")来查询存储在每个项目中的值,例如在按下"更新"按钮之后。