2

我编写了一个类,其中包含 ObjectDataSource 的 Select- 和 Update-Methods。UpdateMethod 接收一个被调用类的实例。我的问题是,只有在 DetailsView 中绑定的属性被设置,其他的有它们的默认值。

这是我的代码:

类声明

public class Foo
{
  public string Prop1 {get;set:}
  public int Prop2 {get;set;}
}

更新方法

[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 中,因此在往返期间不保留。是关于这个问题的讨论。微软这里的建议是将不可见字段的字段名称添加到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>

这对于模板中的控件不是必需的 - 例如使用Text='<%# Bind("Prop2") %>'. 即使对于不可见的 TextBox,在往返期间也会保留 ViewState(当然,除非您禁用 ViewState)。

于 2010-03-26T16:54:19.957 回答