如何将实体框架对象数据绑定到FormView

时间:2011-09-22 09:19:48

标签: asp.net entity-framework data-binding webforms asp.net-4.0

我是使用EF实体实例绑定到许多FormView控件的数据,但是为了在不使用 EntityDataSource 控件的情况下实现我想要的东西,我不得不诉诸这个荒谬的kludge:

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

我怀疑我必须从FormView派生自己的控件并使其能够接受几乎POCO作为数据源。我从哪里开始?

2 个答案:

答案 0 :(得分:0)

不确定这是世界上最好的主意,但这是您从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;
            }
        }
 }

答案 1 :(得分:0)

这是我的实现,与patmortech的想法相同,但我也发现BaseDataBoundControl上的ValidateDataSource方法是在数据源不可枚举的情况下在运行时抛出异常的方法。

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);
        }
    }

编辑:

考虑到这个建议,我对我检查分配的DataSource是否可枚举的方式进行了一些更改。我还设法创建了一个示例应用程序(VS 2010解决方案)来演示更改。该应用可以从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);
    }

如果这不是所需的功能,请随时提出更多更改。欢呼声。