我有一个充满 LinqDataSource 的 DetailsView 控件,没有问题。
用户在更新信息的时候需要上传文件,所以,我在EditItemTemplate里面创建了一个带有asp:FileUpload控件的TemplateField(itemTemplate只是一个asp标签)。
问题是当我尝试更新数据时,在 DetailsView.OnItemUpdating 中,DetailsViewUpdateEventArgs.OldValues不包含所有旧值(也不包含键)。实际上,它只有ArticleTitle和ArticleNumber。
我认为这是因为 TemplateFields 的其他人,所以我将 ArticleDesc 从BoundField更改为TemplateField ,在EditItemTemplate中添加了一个多行文本框,在ItemTemplate中添加了一个 asp 标签,它工作正常(ArticleDesc 的原始值在那里)。
这个问题可以通过其他方式解决,比如再次查询数据,但我不喜欢这种解决方案。此外,我想了解它为什么会发生。
ASPX 页面
<asp:DetailsView ID="ModArticleDV" runat="server" AllowPaging="True" OnItemUpdated="ModArticleDV_ItemUpdated" OnItemUpdating="ModArticleDV_ItemUpdating" OnModeChanged="ModArticleDV_ModeChanged" OnDataBound="ModArticleDV_DataBound" OnDataBinding="ModArticleDV_DataBinding" AutoGenerateRows="False" DataSourceID="ArticleDS" DataKeyNames="ArticleID">
<Fields>
<asp:BoundField DataField="ArticleID" HeaderText="ID" SortExpression="ArticleID" ReadOnly="true" />
<asp:BoundField DataField="ArticleNumber" HeaderText="Número" SortExpression="ArticleNumber" />
<asp:BoundField DataField="ArticleTitle" HeaderText="Título" SortExpression="ArticleTitle" ConvertEmptyStringToNull="false" />
<asp:TemplateField HeaderText="Archivo PDF" SortExpression="ArticleFile">
<EditItemTemplate>
Archivo Actual: <asp:Label ID="EditCurrentFileLbl" Text='<%# Eval("ArticleFile") %>' runat="server" /><br />
<label class="upload-file">Nuevo Archivo</label>: <asp:FileUpload ID="NewFileUpload" runat="server" CssClass="file-upload" />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="CurrentFileLbl" runat="server" Text='<%# Eval("ArticleFile") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Descripción" ConvertEmptyStringToNull="false">
<EditItemTemplate>
<asp:TextBox ID="NewDescription" TextMode="MultiLine" Text='<%# Eval("ArticleDesc") %>' runat="server" />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="CurrentDescription" Text='<%# Eval("ArticleDesc") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Cantidad de Páginas" SortExpression="ArticlePageCount" ConvertEmptyStringToNull="false">
<EditItemTemplate>
<asp:UpdatePanel ID="CountPagesUP" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="CountPagesLink" EventName="Click" />
</Triggers>
<ContentTemplate>
Páginas: <asp:Label runat="server" ID="PageCountLabel" Text='<%# Eval("ArticlePageCount") %>' />
</ContentTemplate>
</asp:UpdatePanel>
<asp:LinkButton ID="CountPagesLink" runat="server" OnClick="CountPagesLink_Click">Contar Páginas</asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="CurrentPageCountLbl" Text='<%# Eval("ArticlePageCount") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Pertenece al" SortExpression="MagazineID">
<EditItemTemplate>
<asp:DropDownList ID="NewMagazine" runat="server" DataSourceID="MagazineDS" DataTextField="MagazineTitle" DataValueField="MagazineID" OnPreRender="NewMagazine_PreRender"></asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="CurrentMagazineLbl" runat="server" OnPreRender="CurrentMagazineLbl_PreRender" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Autores" SortExpression="ArticleID">
<EditItemTemplate>
<label>Filtrar Autor</label>: <input type="text" class="search-in-list" title="Reduce la lista de autores. Ingrese el appellido paterno, materno y/o nombre. Debe incluir tildes de ser necesario." /><br />
<asp:ListBox ID="NewAuthors" runat="server" CssClass="list-to-search" SelectionMode="Multiple" DataSourceID="AuthorDS" DataTextField="AuthorFullName" DataValueField="AuthorID" Height="206px" Width="292px" OnDataBound="NewAuthors_DataBound"></asp:ListBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="CurrentAuthorsLbl" runat="server" OnPreRender="CurrentAuthorsLbl_PreRender" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField Visible="false">
<ItemTemplate>
<asp:Label ID="MagazineID" Text='<%# Eval("MagazineID") %>' runat="server" />
<asp:Label ID="CurrentAuthorID" runat="server" OnPreRender="CurrentAuthorID_PreRender" />
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" UpdateText="Guardar" CancelText="Cancelar" SelectText="Seleccionar" NewText="Nuevo" InsertText="Agregar" EditText="Editar" DeleteText="Borrar" ControlStyle-CssClass="command-field-control" />
</Fields>
</asp:DetailsView>
<asp:LinqDataSource ID="ArticleDS" runat="server" ContextTypeName="LinqToSql.FinderSchemaDataContext" EnableUpdate="True" OrderBy="ArticleID" TableName="Articles" EnableDelete="True" EntityTypeName=""></asp:LinqDataSource>
<asp:LinqDataSource ID="MagazineDS" runat="server" ContextTypeName="LinqToSql.FinderSchemaDataContext" EntityTypeName="" OrderBy="PublishYear, MagazineNumber" TableName="Magazines" Select="new (MagazineID, MagazineNumber, MagazineName, PublishYear, String.Format("Volumen {0} del año {1}", MagazineNumber.ToString(), PublishYear.ToString()) AS MagazineTitle)"></asp:LinqDataSource>
<asp:LinqDataSource ID="AuthorDS" runat="server" ContextTypeName="LinqToSql.FinderSchemaDataContext" EntityTypeName="" OrderBy="AuthorFName, AuthorMName, AuthorName" TableName="Authors" Select="new (AuthorID, AuthorFName, AuthorMName, AuthorName, String.Format("{0} {1} {2}", AuthorFName.ToString(), AuthorMName.ToString(), AuthorName.ToString()) AS AuthorFullName)" />
代码背后
protected void ModArticleDV_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
{
Messages.InnerHtml = "";
try
{
Messages.InnerHtml += "<h3>Old Values</h3><br />";
foreach (DictionaryEntry de in e.OldValues)
{
Messages.InnerHtml += String.Format("Key: {1} - Value: {0}<br />", de.Value, de.Key);
}
Messages.InnerHtml += "<h3>New Values</h3><br />";
foreach (DictionaryEntry de in e.NewValues)
{
Messages.InnerHtml += String.Format("Key: {1} - Value: {0}<br />", de.Value, de.Key);
}
e.Cancel = false;
}
catch (Exception ex)
{
Messages.InnerHtml += ex.Message;
}
}
这仅显示 ArticleNumber 和 ArticleTitle
我尝试了什么?
- 使用 Bind 而不是 Eval
- 使用默认的 DetailsView 和 LinqDataSource 用原始值填充 e.OldValues,但我没有注意到差异:(。
- 我已多次阅读有关 DetailsView、DetailsViewUpdateEventArgs 和许多其他资源的 MSDN 文档,但没有一个提示我(我在某处读到可能是因为 TemplateField,但在我运行的测试中,它们工作正常) .
- 这个问题是相关的,但这是我一直向 TemplateField 添加数据的方式。
如果有人可以给我一些东西来了解它发生的原因,或者如果有人可以告诉我在哪里填写 OldValues(除了 ItemUpdating 事件),那就太好了:)。
提前致谢。