这是一个FormView错误吗?

时间:2012-09-26 22:21:25

标签: c# asp.net linq linq-to-sql formview

我有一个FormView(启用了分页),它绑定到ASP.NET页面上的LinqDataSource。我遇到了一些非常奇怪的行为,无法弄清楚它为什么会发生。为了简单起见,我已经删除了一些不需要的代码(其他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。

2 个答案:

答案 0 :(得分: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属性设置为:

    • TopAndBottom

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

  • 如果您将Position属性设置为:

    • BUTTOM

    按预期工作

老实说,如果这是一个错误,我无法相信没有其他人找到并报告它。

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

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

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

编辑1

I uploaded the code to my GitHub site for reference

答案 1 :(得分:0)

这很可能是由于&amp; amp&amp; lt和&amp; gt的网址解码所致。

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