Как данные связывают объекты Entity Framework с FormView - PullRequest
4 голосов
/ 22 сентября 2011

Я привязываю данные ко многим элементам управления FormView, используя экземпляры сущностей EF, но мне приходится прибегать к этому нелепому клуджу, чтобы достичь того, чего я хочу, без использования EntityDataSource элементов управления:

propertyHeaderSection.DataSource = new List<PropertyDetailsModel> { _propertyDetails };

Я подозреваю, что мне придется извлечь свой собственный элемент управления из FormView и разрешить ему принимать почти POCO в качестве источника данных. С чего начать?

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Это моя реализация, вроде той же идеи, что и patmortech, но я также обнаружил, что метод ValidateDataSource в BaseDataBoundControl создает исключение во время выполнения, если ваш источник данных не перечисляем.

public class CustomFormView : System.Web.UI.WebControls.FormView
    {
        public override object DataSource
        {
            get
            {
                if (!(base.DataSource is IEnumerable))
                    return new[] {base.DataSource};

                return base.DataSource;
            }
            set
            {
                base.DataSource = value;
            }
        }

        // This method complains at run time, if the datasource is not 
        // IListSource, IDataSource or IEnumerbale
        protected override void ValidateDataSource(object dataSource)
        {
            //base.ValidateDataSource(dataSource);
        }
    }

РЕДАКТИРОВАТЬ:

Учитывая это предложение, я внес некоторые изменения в способ проверки того, является ли назначенный источник данных перечислимым или нет.Мне также удалось создать пример приложения (VS 2010 Solution) для демонстрации изменений.Приложение можно загрузить с http://raghurana.com/blog/wp-content/attachments/FormViewDataProblem.zip

Короче говоря, это то, что я проверяю, чтобы убедиться, что существующий источник данных уже может быть перечислен:

public static bool CanEnumerate( this object obj )
    {
        if (obj == null) return false;

        Type t = obj.GetType();

        return t.IsArray ||
               t.Implements(typeof (IEnumerable).FullName) ||
               t.Implements(typeof (IListSource).FullName) ||
               t.Implements(typeof (IDataSource).FullName);
    }

Пожалуйста, не стесняйтесьбольше изменений, если это не совсем желаемый функционал.Приветствия.

0 голосов
/ 28 сентября 2011

Не уверен, что это лучшая идея в мире, но это то, как вы могли бы извлечь из FormView, чтобы позволить значения источника данных для одного объекта. По сути, он выполняет ту же проверку, что и ValidateDataSource для внутренних целей, а затем создает оболочку списка для элемента, если он еще не является допустимым типом.

public class SingleObjectFormView : System.Web.UI.WebControls.FormView
{
        public override object DataSource
        {
            get
            {
                return base.DataSource;
            }
            set
            {
                //will check if it's an expected list type, and if not, 
                //will put it into a list

                if (! (value == null || value is System.Collections.IEnumerable || value is System.ComponentModel.IListSource || value is System.Web.UI.IDataSource) )
                {
                    value = new List<object> { value };
                }

                base.DataSource = value;
            }
        }
 }
...