0

我有一个充满 LinqDataSource 的 DetailsView 控件,没有问题。

用户在更新信息的时候需要上传文件,所以,我在EditItemTemplate里面创建了一个带有asp:FileUpload控件的TemplateField(itemTemplate只是一个asp标签)。

问题是当我尝试更新数据时,在 DetailsView.OnItemUpdating 中,DetailsViewUpdateEventArgs.OldValues不包含所有旧值(也不包含键)。实际上,它只有ArticleTitleArticleNumber

我认为这是因为 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(&quot;Volumen {0} del año {1}&quot;, 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(&quot;{0} {1} {2}&quot;, 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 事件),那就太好了:)。

提前致谢。

4

1 回答 1

0

我确认字典 e.(New|Old)Values 没有用TemplateField (s) 中的数据填充。

我的解决方案(我不知道有什么更好的方法)是使用隐藏的 TemplateField(Visible="false"),并在 ItemTemplate 中添加带有标签的原始值(asp:Label),然后使用 DetailsView.FindControl( “控制ID”):

<TemplateField Visible="false">
  <ItemTemplate>
    <asp:Label ID="OriginalValue1" runat="server" Text='<%# Eval("Column1") %>' />
    <asp:Label ID="OriginalValueN" runat="server" Text='<%# Eval("ColumnN") %>' />
  </ItemTemplate>
</TemplateField>

后面的代码中:

// DetailsView.ID = "MyDetailsView";
Label original1 = (Label)MyDetailsView.FindControl("OriginalValue1");
Label originalN = (Label)MyDetailsView.FindControl("OriginalValueN");

出于某种原因,我无法解释,我使用 TemplateFields 运行的一些测试有效(数据在没有我干预的情况下添加到字典中),这就是为什么我感到困惑并认为这是一个错误的原因。

无论如何,问题现在已经解决了,我希望这可以帮助某人:)。

于 2013-10-16T16:43:53.737 回答