这是一个FormView错误吗?(Is this a FormView bug?)

2019-10-17 06:09发布

我有一个FormView(启用了分页)绑定到一个使用LinqDataSource ASP.NET页面上。 我遇到一些怪异的行为,并不能找出它的原因。 对这个问题进行简单起见,我已删除一些不需要的代码(其他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。

Answer 1:

我复制你的代码的一部分,我做了一个实验,我想,我尝试相同的行为。

这是我做的:

<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属性:

    • 最佳

    • 顶部和底部

    你会尝试同样的问题。 (正如你可能提到一个bug)

  • 如果您设置Position属性:

    • BUTTOM

    它按预期工作

说实话,如果这是一个错误,我不能相信没有别的发现并报告。

我做了与Visual Studio 2012的同一实验网络(ASP.NET 4.5),我尝试了完全相同的行为...

这让我觉得,也许我做的东西基本上是错误的,也许这是不是一个错误,这就是为什么我尝试用两个版本的ASP.NET 4和ASP.NET 4.5的相同的行为,但如果是这样的话,我根本无法弄清楚它是什么。

在另一方面,如果这是一个错误,该错误同样会出现在ASP.NET 4.5

编辑1

我上传的代码,以我的GitHub网站参考



Answer 2:

这是最可能的原因的&放大&amp; lt和&GT的URL解码。

尝试取出和放大器“;” 而只使用&符号。 您可以使用该方法来注入。



文章来源: Is this a FormView bug?