1

ASP.NETページのLinqDataSourceにバインドされているFormView(ページングが有効になっている)があります。私はいくつかの非常に奇妙な行動を経験していて、なぜそれが起こっているのか理解できません。この質問を簡単にするために、この動作を示すために不要なコード(他のFormViewテンプレートなど)を削除しました。

私のFormViewには、3つのフィールド、2つのテキストボックスと1つのDropDownListがあります。DropDownListは、ページ上の別のLinqDataSourceにバインドされ、外部キー値を含みます。FormViewのLinqDataSourceに含まれるレコードが1つだけで、それを更新しようとすると、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はレコードを正常に更新します。ポケットベルの設定がこれと関係がある理由を誰かが知っていますか?.NETFramework4.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 に行が1つしかない場合は、FormView動作がおかしくなり、コマンドが期待どおりに機能しません。

    • 私のSaveコマンドは実行されませんが、代わりに`キャンセルコマンドが実行されます

    • 私のCancelコマンドは私のFormView消えます...

&amp;最初はキャラクターのせいだと思いましたが、そうではありません

問題をに絞り込みましたPosition="TopAndBottom"

  • Position属性を次のように設定した場合:

    • TopAndBottom

    同じ問題を実験します。(あなたがおそらくバグに言及するように)

  • Position属性を次のように設定した場合:

    • ボトム

    期待どおりに動作します

正直なところ、これがバグだとしたら、他の誰もそれを見つけて報告していないとは信じられません。

Visual Studio 2012 for Web(ASP.NET 4.5)で同じ実験を行い、まったく同じ動作を実験しています...

これにより、おそらく私は根本的に間違ったことをしていると思います。おそらくこれはバグではないため、ASP.NET4とASP.NET4.5の両方のバージョンで同じ動作を実験していますが、その場合は、単にそれが何であるかを理解することはできません。

一方、これがバグである場合、同じバグがASP.NET4.5に存在します。

編集1

参照用にコードをGitHubサイトにアップロードしました

于 2012-09-30T19:46:45.567 に答える
0

これは、&amp&ltおよび&gtのURLデコードが原因である可能性があります。

&amp';'を取り出してみてください &記号を使用します。その方法を使用して注入することができます。

于 2012-09-26T22:48:16.417 に答える