C# 为什么ObjectDataSource中的UpdateMethod只从DetailsView中的可见控件接收属性值?

C# 为什么ObjectDataSource中的UpdateMethod只从DetailsView中的可见控件接收属性值?,c#,asp.net,objectdatasource,detailsview,C#,Asp.net,Objectdatasource,Detailsview,我已经为ObjectDataSource编写了一个包含选择和更新方法的类。UpdateMethod接收被调用类的实例。我的问题是,只设置DetailsView中绑定的属性,其他属性都有其默认值 这是我的密码: 类声明: public class Foo { public string Prop1 {get;set:} public int Prop2 {get;set;} } 更新方法: [DataObjectMethod(DataObjectMethodType.Update)] p

我已经为ObjectDataSource编写了一个包含选择和更新方法的类。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>
标记

[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>

但是这个解决方案是垃圾,因为如果我尝试更改底层数据结构,它不够灵活。我知道,在这种情况下,我必须编辑我的代码,但我只需要将自定义包装器类作为参数。这可能吗?

不可见的
数据控制字段的值(如
边界字段
)似乎不包括在ViewState中,因此在往返过程中不会保留。是关于这个问题的讨论。Microsofts建议将不可见字段的字段名添加到数据绑定控件的
DataKeyNames
属性中。然后可以从
字段
集合中删除不可见字段:

<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中的文本框一样,它是使用
Text=''
绑定的。此处,即使对于不可见的文本框,在往返过程中也会保留ViewState(当然,除非您禁用ViewState)。

只是为了确保我是否正确理解了这个问题:您说“仅设置了在DetailsView中绑定的属性,其他属性都有其默认值”但是在您的标记示例中,
Prop2
实际上是绑定的,只是不可见。您的问题现在是否出现在未绑定(标记中根本不存在)或已绑定但不可见的属性上?只有绑定到可见控件的值才能正确设置。切换到Visible=“true”将导致设置prop2正确的存储库,这正是我所寻找的awswer;)哈哈,我自己也很幸运,我找到了解决你问题的办法。因为今天我遇到了一个非常类似的问题,一个EntityDataSource和FormView中的一个字段没有声明性绑定(只在代码隐藏中分配)。更新值时出现类似问题。然后我想起。。。“难道没有这个问题吗?”…我用这个字段尝试了这个“DataKeyNames”技巧,瞧。。。它起作用了!(我觉得这真的是一个奇怪的“诡计”或是对属性的滥用——不管是不是微软推荐的——因为我的领域与“密钥”无关。)