Отображение компонентов 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 и т. д.

Другие вопросы по тегам