代码之家  ›  专栏  ›  技术社区  ›  Strelok

并非所有由FormView使用的EntityDataSource加载的实体属性

  •  1
  • Strelok  · 技术社区  · 15 年前

    我疯了。这是一个简单的场景:

    实体定义(生成)

    // 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 
     }
    

    基本上,只有表单视图中绑定的属性在更新事件处理程序中才有它们的值可用,更糟的是,当我尝试从E.Context逐键重新加载实体时,我再次只获取那些属性。

    给出了什么?如何在更新事件中访问实体的所有属性? 另外,如果数据源包含include,则这些包含的值在更新事件中不可用。发生什么事了,请帮忙!

    1 回复  |  直到 15 年前
        1
  •  3
  •   gbenes    15 年前

    这也让我很沮丧,直到我退后并意识到原因。

    这是我发现的。只有当属性绑定到对象时,这些属性才会存储在视图状态中。在往返过程中,只有那些存储的属性才会从视图状态恢复到实体对象。这是有意义的,因为实际上只有正在处理的数据才可用。但是,这并没有考虑到代码隐藏中对实体对象的任何操作。如果使用eval而不是bind,也会发生这种情况:

    <asp:TextBox runat="server" ID="textbox1" Text='<%# Eval("Property1")%>'
    

    这是我使用的工作。如果要使用代码隐藏中的实体对象属性之一,请将其绑定到EditItemTemplate中的隐藏字段。一旦我这样做了,属性就被恢复到实体对象中,并在代码中可用。

    <asp:HiddenField ID="HiddenField1" runat="server" value='<%# Bind("Property2") %>'/>