我正在失去理智。这是一个简单的场景:
实体定义(生成)
// this class is obviously generated by the designer, this is just an example
public class SomeEntity {
public int SomeEntityID { get; set; } // primary key
public String Property1 { get; set; }
public String Property2 { get; set;
}
..在aspx文件中
<asp:EntityDataSource
ID="EntityDataSource1" runat="server"
ConnectionString="name=Connection" DefaultContainerName="SomeEntities"
EnableDelete="True" EnableInsert="True" EnableUpdate="True"
EntitySetName="SomeEntity" OnUpdating="UpdatingEntity" AutoGenerateWhereClause="true">
<WhereParameters>
<asp:QueryStringParameter Name="SomeEntityID" QueryStringField="SomeEntityID" Type="Int32"/>
</WhereParameters>
</asp:EntityDataSource>
<asp:FormView runat="server" ID="FormView1" DataSourceID="EntityDataSource1">
<EditItemTemplate>
<asp:TextBox runat="server" ID="textbox1" Text='<%# Bind("Property1")%>'
</EditItemTemplate>
</asp:FormView>
...在代码背后
// ... as per Diego Vega's unwrapping code
public TEntity GetItemObject<TEntity>(object dataItem)
where TEntity : class
{
var entity = dataItem as TEntity;
if (entity != null)
{
return entity;
}
var td = dataItem as ICustomTypeDescriptor;
if (td != null)
{
return (TEntity)td.GetPropertyOwner(null);
}
return null;
}
protected void UpdatingEntity(object sender, EntityDataSourceChangingEventArgs e) {
SomeEntity entity = GetItemObject<SomeEntity>(e.Entity);
// at this point entity.Property1 has the value of whatever was entered in the
// bound text box, but entity.Property2 is null (even when the field bound to this
// property in the database contains a value
// if I add another textbox to form view and bind Property2 to it ... then I can
// obviously get its value from the entity object above
}
基本上,只有表单视图中绑定的属性在Updating事件处理程序中可以使用它们的值,更糟糕的是当我尝试按键从e.Context重新加载实体时,我只会再次获得这些属性。
是什么给出的?如何在Updating事件中访问实体的所有属性? 此外,如果数据源包含Include,那么包含的值在Updating事件中不可用。发生了什么,请帮助!
答案 0 :(得分:3)
这让我感到沮丧,直到我退后一步并意识到原因。
这是我发现的。仅当属性绑定到对象时,属性才存储在视图状态中。在往返中,只有那些存储的属性从视图状态恢复到实体对象。它是有意义的,因为只有正在使用的数据才真正可用。但是,这并没有考虑到后面代码中实体对象的任何操作。如果您使用Eval而不是Bind:
,也会发生这种情况<asp:TextBox runat="server" ID="textbox1" Text='<%# Eval("Property1")%>'
这是我使用的解决方法。如果我要在代码隐藏中使用其中一个实体对象属性,我将它绑定到EditItemTemplate中的隐藏字段。完成此操作后,属性将恢复为实体对象,并在代码隐藏中可用。
<asp:HiddenField ID="HiddenField1" runat="server" value='<%# Bind("Property2") %>'/>