Отображение компонентов nhiberbate в asp.net
Я работаю над проектом 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();
});
}
}
1 ответ
Для этого я использовал следующий формат:
<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 и т. д.