我有一个实体
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}
}
现在我使用ObjectDataSource Control将Collection绑定到GridView。 在PersonTept类的TemplateField下面看起来像
<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实体时,它会抛出错误,因为下拉列表显示Value字段和文本字段,而Person实体需要一个实际绑定到下拉列表的Dept Entity
答案 0 :(得分: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。