1

我有一个绑定到 ASP.NET 页面上的 LinqDataSource 的 FormView(启用了分页)。我遇到了一些非常奇怪的行为,无法弄清楚为什么会这样。为简单起见,我删除了一些不需要的代码(其他 FormView 模板等)来演示此行为。

我的 FormView 有 3 个字段、两个文本框和一个 DropDownList。DropDownList 绑定到页面上的另一个 LinqDataSource 并包含外键值。当 FormView 的 LinqDataSource 仅包含一条记录并且我尝试更新它时,更新失败,因为 DropDownList 的选定值始终为空,无论我为它选择哪个值。当 FormView 的 LinqDataSource 包含 2 个或更多记录时,它会正常工作。

现在这是真正奇怪的事情。由于 FormView 的 PagerSettings,更新实际上失败了!当我只使用默认的寻呼机设置时,一切都很好。当我将 PagerMode 更改为 时NextPreviousFirstLast,更新失败。

这是我的 FormView 及其数据源:

<asp:FormView ID="fvData" runat="server" AllowPaging="True" 
    DataKeyNames="ID" DataSourceID="ldsData" DefaultMode="Edit">
    <EditItemTemplate>
        <table class="pad5">
            <tr>
                <td class="field-name">AREA:</td>
                <td>
                    <asp:DropDownList ID="cboAREA" runat="server" DataTextField="AREA_NAME" 
                        DataValueField="AREA1" SelectedValue='<%# Bind("AREA") %>' DataSourceID="ldsAreas" />
                </td>
            </tr>
            <tr>
                <td class="field-name">LOOP:</td>
                <td><asp:TextBox ID="txtLOOP" runat="server" Text='<%# Bind("LOOP") %>' /></td>
            </tr>
            <tr>
                <td class="field-name">LOOP DESCRIPTION:</td>
                <td><asp:TextBox ID="txtLOOP_DESCRIPTION" runat="server" 
            Text='<%# Bind("LOOP_DESCRIPTION") %>' style="width: 600px" /></td>
            </tr>
        </table>

        <asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" CausesValidation="True" />
        <asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" CausesValidation="False" />
    </EditItemTemplate>
    <PagerSettings Mode="NextPreviousFirstLast" 
        FirstPageText="&amp;lt;&amp;lt; First" LastPageText="Last &amp;gt;&amp;gt;" 
        NextPageText="Next &amp;gt;" PreviousPageText="&amp;lt; Prev" 
        Position="TopAndBottom" />
    <PagerStyle CssClass="pager" />
</asp:FormView>

<asp:LinqDataSource ID="ldsData" runat="server" 
    ContextTypeName="E_and_I.EAndIDataDataContext" EnableDelete="True" 
    EnableInsert="True" EnableUpdate="True" EntityTypeName="" 
    TableName="INSTRUMENT_LOOP_DESCRIPTIONs" onselecting="ldsData_Selecting" OrderBy="ID ASC" >
</asp:LinqDataSource>

<asp:LinqDataSource ID="ldsAreas" runat="server" 
    ContextTypeName="E_and_I.EAndIDataDataContext" EntityTypeName="" 
    TableName="AREAs" onselecting="ldsAreas_Selecting">
</asp:LinqDataSource>

这是我的 LinqDataSource 的两个Selecting事件:

EAndIDataDataContext db = new EAndIDataDataContext();

protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
    e.Result = db.INSTRUMENT_LOOP_DESCRIPTIONs.Take(1); // we only want one record for testing
}

protected void ldsAreas_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
    e.Result = db.AREAs.OrderBy(a => a.AREA1).Select(a => new { AREA1 = a.AREA1, AREA_NAME = "(" + a.AREA1 + ") " + a.AREA_NAME });
}

我已经将问题追溯到以下几行:

<PagerSettings Mode="NextPreviousFirstLast" 
    FirstPageText="&amp;lt;&amp;lt; First" LastPageText="Last &amp;gt;&amp;gt;" 
    NextPageText="Next &amp;gt;" PreviousPageText="&amp;lt; Prev" 
    Position="TopAndBottom" />

一旦我删除了上述PagerSettings元素,FormView 就会很好地更新记录!有谁知道为什么寻呼机设置与此有关?我正在使用 .NET Framework 4.0。

4

2 回答 2

2

我复制了您的部分代码并进行了实验,我想,我正在尝试相同的行为。

这就是我所做的:

<asp:LinqDataSource runat="server" ID="lds"
    TableName="jobs" ContextTypeName="WebApplication2.DataAccess.PubsDataContext" >

</asp:LinqDataSource>
<asp:LinqDataSource runat="server" ID="ldse"
    TableName="employee" ContextTypeName="WebApplication2.DataAccess.PubsDataContext" OnSelecting="ldse_Selecting">

</asp:LinqDataSource>

<asp:FormView runat="server" DefaultMode="Edit" ClientIDMode="Predictable" DataKeyNames="emp_id" DataSourceID="ldse"
    AllowPaging="true" OnItemCommand="Unnamed_ItemCommand" ID="formView">
    <EditItemTemplate>
        <div>
            <asp:DropDownList runat="server" ID="ddlJobs" DataSourceID="lds" DataTextField="job_desc" DataValueField="job_id">
            </asp:DropDownList>
        </div>
        <div>
            <asp:TextBox runat="server" TextMode="MultiLine" ID="txtDesc" />
        </div>
        <div>
            <asp:Button Text="Save" runat="server" CommandName="Save" CausesValidation="true" />
            <asp:Button Text="Cancel" runat="server" CommandName="Cancel" CausesValidation="false" />
        </div>
    </EditItemTemplate>
    <PagerSettings Mode="NextPreviousFirstLast" 
        FirstPageText="&amp;lt;&amp;lt; First" LastPageText="Last &amp;gt;&amp;gt;" 
        NextPageText="Next &amp;gt;" PreviousPageText="&amp;lt; Prev" 
        Position="TopAndBottom" />

这些是我的观察:

  • 如果FormView 仅包含一行,FormView行为很奇怪,我的命令无法按预期工作。

    • 我的Save命令从未被触发,而是“取消”命令被触发

    • 我的Cancel命令让我FormView消失了……

一开始我以为这是因为&amp;角色,但事实并非如此

我把问题缩小到Position="TopAndBottom"

  • 如果将Position属性设置为:

    • 最佳

    • 顶部和底部

    你将尝试同样的问题。(正如你提到的可能是一个错误)

  • 如果将Position属性设置为:

    • 巴顿

    它按预期工作

老实说,如果这是一个错误,我不敢相信没有其他人发现它并报告它。

我用 Visual Studio 2012 for Web (ASP.NET 4.5) 做了同样的实验,我正在试验完全相同的行为......

这让我觉得我可能在做一些根本错误的事情,也许这不是一个错误,这就是为什么我在 ASP.NET 4 和 ASP.NET 4.5 两个版本上试验相同的行为,但如果是这样的话,我根本无法弄清楚它是什么。

另一方面,如果这是一个错误,那么同样的错误将出现在 ASP.NET 4.5 中

编辑 1

我将代码上传到我的 GitHub 站点以供参考

于 2012-09-30T19:46:45.567 回答
0

这很可能是由于 & < 和 > 的 url 解码。

尝试取出 &';' 只需使用 & 符号。您可以使用该方法进行注入。

于 2012-09-26T22:48:16.417 回答