2

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)
{

}

しかし、基礎となるデータ構造に変更を加えようとすると、柔軟性が十分でないため、このソリューションはくだらないものです。その場合でもコードを編集する必要があることはわかっていますが、パラメーターとしてカスタムラッパークラスのみを使用する必要があります。それは可能ですか?

4

1 に答える 1

4

invisible DataControlFields(like BoundField)の値はViewStateに含まれていないため、ラウンドトリップ中に保持されないようです。これがこの問題についての議論です。ここでのMicrosoftの推奨事項は、非表示フィールドのフィールド名をDataKeyNamesデータバインドコントロールのプロパティに追加することです。次に、Fieldsコレクションから非表示フィールドを削除できます。

<asp:DetailsView ID="DetailsView1" runat="server" 
    DataSourceID="ods" EnableModelValidation="True" AutoGenerateInsertButton="True"
    AutoGenerateRows="False" AutoGenerateEditButton="True"
    DataKeyNames="Prop2">
    <Fields>
        <asp:BoundField DataField="Prop1"/>
    </Fields>
</asp:DetailsView>

これは、テンプレート内のコントロールには必要ありません-を使用してバインドされたFormViewのEditItemTemplate内のTextBoxのようにText='<%# Bind("Prop2") %>'。ここで、ViewStateは、非表示のTextBoxの場合でも、ラウンドトリップ中に保持されます(もちろん、ViewStateを無効にしない限り)。

于 2010-03-26T16:54:19.957 に答える