我正在开发一个ASP.NET/C#/fluent nHibernate项目,并且最近发现了我想要实现的Component
映射功能。我相信我的类定义和映射文件是正确的,但我很难通过我的服务和/或存储库层检索组件信息,以便在DetailsView
或FormView
中显示它。
当我使用ObjectDataSource
检索信息时,在相应视图中生成的aspx代码将整个组件放在TextBox
中:
<asp:TextBox ID="extraTextBox" runat="server" Text='<%# Bind("extra") %>' />
我在网上找到了很多关于如何进行映射的资源,但是未能找到有关正确显示组件的更多指导。任何指导将不胜感激!
// Stripped down classes
public partial class ProjectExtra
{
private int _test1;
private int _test2;
public ProjectExtra() {}
public virtual int test1 { get { return this._test1; } set { this._test1 = value; } }
public virtual int test2 { get { return this._test2; } set { this._test2 = value; } }
}
public partial class Project
{
private int _pkProjectID;
private ProjectExtra _extra;
public Project() {}
public virtual ProjectExtra extra
{
get
{
return this._extra;
}
set
{
this._extra = value;
}
}
public virtual int pkProjectID
{
get
{
return this._pkProjectID;
}
set
{
this._pkProjectID = value;
}
}
}
// stripped down mapping
public class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Table(@"Project");
LazyLoad();
Id(x => x.pkProjectID)
.Column("pkProjectID")
.Access.Property()
.Not.Nullable()
.GeneratedBy.Identity();
Component<ProjectExtra>(x => x.extra, m =>
{
// JobsCreatedActual and JobsCreatedEstimate are two integer columns
// in the Project database table
m.Map(x => x.test1).Column("JobsCreatedActual");
m.Map(x => x.test2).Column("JobsCreatedEstimate");
Not.LazyLoad();
});
}
}
答案 0 :(得分:0)
为此,我最终使用以下格式:
<asp:TextBox ID="extraTextBox" runat="server"
Text='<%# Eval("extra.test1") %>' />
我已经看到使用完整DataBinder的其他资源,但结果似乎相同:
<asp:TextBox ID="extraTextBox" runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "test1"))%>' />
不幸的是,Bind
不适用于子类,因此它们仍然需要使用TextBox值等在代码隐藏中构建。