VB.NETアプリケーションのFormViewでEntityDataSourceを使用しています。FormViewには、複数のタブを持つAjaxControlToolKitTabContainsが含まれています。各タブがネーミングコンテナであるため、バインドは値を更新するために正しく機能しません(stackoverflowの他の投稿を読んで発見されたように)。代わりに、EntityDataSourceでUpdateParametersを宣言する必要があります。マークアップの例は次のとおりです。
<asp:FormView ID="fv" runat="server" DataSourceID="eds" DataKeyNames="ID">
<EditItemTemplate>
<asp:TabContainer ID="tc" runat="server">
<asp:TabPanel ID="tp" runat="server" HeaderText="Tab 1">
<ContentTemplate>
<asp:TextBox ID="tbName" runat="server" Text='<%#Eval("Name") %>'></asp:TextBox>
</ContentTemplate>
</asp:TabPanel>
</asp:TabContainer>
</EditItemTemplate>
</asp:FormView>
<asp:EntityDataSource ID="eds" runat="server" ConnectionString="name=NDSEntities"
DefaultContainerName="NDSEntities" EnableFlattening="False" EntitySetName="Customers"
Where="it.ID = @ID" EnableUpdate="true" EnableInsert="true">
<WhereParameters>
<asp:QueryStringParameter Name="ID" QueryStringField="ID" DbType="Guid" />
</WhereParameters>
<UpdateParameters>
<asp:ControlParameter Name="Name" ControlID="fv$tc$tp$tbName" DbType="String" />
</UpdateParameters>
<InsertParameters>
<asp:ControlParameter Name="Name" ControlID="fv$tc$tp$tbName" DbType="String" />
</InsertParameters>
</EntityDataSource>
これは、顧客が編集されて名前が何も設定されない限り、うまく機能します(この場合、null名が許可されていると仮定します)。Name UpdateParameterはNullに設定されていますが、以前にエンティティに値が指定されていたとしても、ObjectStateEntryはNullプロパティに対して変更されるように設定されていません。名前がNull以外に変更されている限り、すべてが正しく更新されます。
EntityDataSourceのUpdateingイベントに次のコードを配置することで、回避策を見つけました。
Dim ose As ObjectStateEntry = context.ObjectStateManager.GetObjectStateEntry(action)
For Each p As Parameter In eds.UpdateParameters
ose.SetModifiedProperty(p.Name)
Next
これにより、UpdateParametersの各プロパティの状態が変更済みに設定されていることを確認します。それは機能しますが、それはハックのようであり、私はそれが将来的に問題を引き起こしているのを見ることができます。他に何かできることはありますか?