ObjectDataSourceのSelectメソッドとUpdateメソッドを含むクラスを作成しました。UpdateMethodは、呼び出されたクラスのインスタンスを受け取ります。私の問題は、DetailsViewでバインドされているプロパティのみが設定され、他のプロパティにはデフォルト値があることです。
これが私のコードです:
クラス宣言:
public class Foo
{
public string Prop1 {get;set:}
public int Prop2 {get;set;}
}
Updatemethod:
[DataObjectMethod(DataObjectMethodType.Update)]
public static void UpdateQuicklink(Foo item)
{
// item.Prop1 // contains correct value
// item.Prop2 // is 0
}
マークアップ:
<asp:DetailsView ID="DetailsView1" runat="server"
DataSourceID="ods" EnableModelValidation="True" AutoGenerateInsertButton="True"
AutoGenerateRows="False" AutoGenerateEditButton="True">
<Fields>
<asp:BoundField DataField="Prop1"/>
<asp:BoundField DataField="Prop2" Visible="false"/>
</Fields>
</asp:DetailsView>
<asp:ObjectDataSource ID="ods" runat="server"
TypeName="NamespaceToClassContaingUpdateMethod"
OldValuesParameterFormatString="original_{0}"
DataObjectTypeName="NamespaceToFoo"
UpdateMethod="UpdateQuicklink">
</asp:ObjectDataSource>
必要なすべてのフィールドをマークアップに公開することはできません。
考えられる解決策は、次のような必要なすべてのパラメーターを受け入れるようにUpdateMethodを書き直すことです。
[DataObjectMethod(DataObjectMethodType.Update)]
public static void UpdateQuicklink(string Prop1, int Prop2)
{
}
しかし、基礎となるデータ構造に変更を加えようとすると、柔軟性が十分でないため、このソリューションはくだらないものです。その場合でもコードを編集する必要があることはわかっていますが、パラメーターとしてカスタムラッパークラスのみを使用する必要があります。それは可能ですか?