2011-09-19 56 views
2

到GridView的我有使用ObjectDataSource控件实体如何将复杂的实体类型绑定使用的ObjectDataSource

class Person 
{ 
public int Age{get;set;} 
public string Name{get;set;} 
public Department Dept{get;set;} 
} 

class Department 
{ 
public int DeptId{get;set;} 
public string DeptName{get;set} 
} 

现在我结合收集到的GridView。 根据模板列的Person类的部门貌似

<EditItemTemplate> 
     <asp:DropDownList ID="cmbStatus" DataTextField="DeptName" SelectedValue='<%# Bind("Dept.DeptId") %>' 
      DataValueField="DeptId" runat="server" CssClass="ddl150px ddlbg" 
      DataSourceID="deptCollection" /> 
     <asp:ObjectDataSource ID="deptCollection" runat="server" 
        SelectMethod="GetDeptList" TypeName="LIMS.BusinessObject.Department" > 
    </asp:ObjectDataSource> 
</EditItemTemplate> 

现在我的网格被绑定使用现在

  <asp:ObjectDataSource ID="PersonCollection" runat="server" 
       SelectMethod="GetPersonList" 
       TypeName="LIMS.BusinessObject.Person" 
       DataObjectTypeName="LIMS.DomainModel.Person" 
       DeleteMethod="Delete" InsertMethod="Create" UpdateMethod="Update" 
       ondeleting="PersonCollection_Deleting" 
       onupdating="PersonCollection_Updating"> 
      </asp:ObjectDataSource> 

,当我尝试更新这个人的实体,它会引发错误,因为下拉显示值字段和文本字段和Person实体需要一个实际绑定到下拉列表的Dept实体

回答

3

您不应该直接在表示层aspx中使用复杂实体。因为如果域模型发生变化,例如添加一些字段,则会更新应用程序的每个aspx。你应该提供一个“视图模型”是这样的:

class PersonView 
{ 
    public int Age{get;set;} 
    public string Name{get;set;} 

    public int DeptId{get;set;} 
    public string DeptName {get { ... }} 
} 

它不应该是一个DTO:你不需要传输主机之间进行序列化的数据,但对于视图的模式。

薄层可以将模型实体转换为查看模型。它可能是由ObjectDataSource很好支持的DataObject