【问题标题】:Why does the UpdateMethod in ObjectDataSource only receive values for properties from visible controls in DetailsView?为什么ObjectDataSource 中的UpdateMethod 只接收DetailsView 中可见控件的属性值?
【发布时间】:2010-03-26 15:09:04
【问题描述】:

我编写了一个类,其中包含 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)
{

}

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

【问题讨论】:

  • 只是为了确保我是否正确理解了这个问题:您说“仅设置了 DetailsView 中绑定的属性,其他属性具有默认值”但在您的标记示例中 Prop2 IS实际上绑定,它只是不可见。您的问题现在是否出现在真正未绑定(根本不存在于标记中)或已绑定但不可见的属性?
  • 只有绑定到可见控件的值才能正确设置。切换到 Visible="true" 会导致正确设置 prop2

标签: c# asp.net objectdatasource detailsview


【解决方案1】:

似乎不可见的DataControlFields(如BoundField)的值不包含在 ViewState 中,因此在往返期间不会保留。 Here 是关于这个问题的讨论。微软的建议here是将不可见字段的字段名称添加到数据绑定控件的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='&lt;%# Bind("Prop2") %&gt;' 绑定的 FormView 的 EditItemTemplate 中的 TextBox。即使对于不可见的 TextBox,ViewState 也会在往返期间保留(当然,除非您禁用 ViewState)。

【讨论】:

  • 谢谢,正是我正在寻找的那种 awswer ;)
  • 哈哈,我为您的问题寻找解决方案甚至是我自己的幸运。因为今天我遇到了一个非常相似的问题,即 EntityDataSource 和 FormView 中的一个字段,该字段没有以声明方式绑定(仅在代码隐藏中分配)。更新值的类似问题。然后我想起来了……“不是有这个问题吗?” ...我已经尝试过使用该字段的“DataKeyNames”技巧,瞧...它有效! (我觉得这真的是一个奇怪的“把戏”或对该属性的滥用——无论是否由 MS 推荐——因为我的领域与“钥匙”无关。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2010-12-17
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多