В чем смысл ObjectDataSource

Учитывая, что каждая сетка, поле со списком, список флажков и вообще многострочный элемент управления поддерживают привязку непосредственно к любому IEnumerable, в чем смысл ObjectDataSource?

Зачем использовать его, а не привязывать непосредственно к вашей коллекции? Особенно, если у вас уже есть разумное разделение проблем на уровне бизнеса, представления и данных?

Я также считаю, что это еще более актуальный вопрос с момента появления LINQ. Я часто обнаруживал, что при привязке я хотел бы выполнить дальнейшее упорядочение, исключение и т. д. с помощью LINQ, и я считаю, что это невозможно при использовании ObjectDataSource без создания конкретного метода для вашего (потенциально единственного варианта использования)?

Итак, когда уместно использовать ObjectDataSource и каковы преимущества по сравнению с прямой привязкой к IEnumerable?


person Maxim Gershkovich    schedule 30.09.2011    source источник
comment
Вы нашли свое решение/ответ? Вы должны отметить ответ или, что еще лучше, прокомментировать, если вы все еще чувствуете, что не ответили.   -  person Eriawan Kusumawardhono    schedule 01.10.2011


Ответы (2)


Во-первых, ObjectDataSource обычно используется в ASP.NET WebForms (aspx). ObjectDataSource находится в System.Web.UI.WebControls, как вы можете увидеть эту ссылку в библиотеке MSDN:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.aspx

Использование ObjectDataSource для привязки ваших данных означает, что вы привязываете источник данных как объект, который может быть в форме DataSet или любого другого объекта .NET, который реализует IEnumerable. Использование ObjectDataSource означает, что вы должны выполнить свой собственный метод Select, Update, Insert и Delete, который обычно находится в SqlDataSource.

В библиотеке MSDN есть хорошее пошаговое руководство: Пошаговое руководство: данные Привязка к пользовательскому бизнес-объекту

Но привязка к простому IEnumerable без реализации IListSource (как это имеет DataTable) означает, что у вас не будет хорошей функции, такой как привязка данных к сложному элементу управления данными, такому как GridView. И вы также потеряете другую функцию, потому что простой IEnumerable сам по себе не может быть привязан двумя способами к другому элементу управления списком, такому как ListView и GridView.

Чтобы ваши данные можно было привязать в двух направлениях, ваш объект также должен реализовать интерфейс INotifyPropertyChanged перед добавлением в IListSource в качестве элемента данных.

Образцы:

public class Employee : BusinessObjectBase
{
    private string      _id;
    private string      _name;
    private Decimal     parkingId;

    public Employee() : this(string.Empty, 0) {}
    public Employee(string name) : this(name, 0) {}

    public Employee(string name, Decimal parkingId) : base()
    {
        this._id = System.Guid.NewGuid().ToString();

        // Set values
        this.Name = name;
        this.ParkingID = parkingId;
    }

    public string ID
    {
        get { return _id; }
    }

    const string NAME = "Name";
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;

                // Raise the PropertyChanged event.
                OnPropertyChanged(NAME);
            }
        }
    }

    const string PARKING_ID = "Salary";
    public Decimal ParkingID
    {
        get { return parkingId; }
        set
        {
            if (parkingId != value)
            {
                parkingId = value;

                // Raise the PropertyChanged event.
                OnPropertyChanged(PARKING_ID);
            }
        }
    }
}

Это реализация INotifyPropertyChanged:

public class BusinessObjectBase : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (null != PropertyChanged)
        {
            PropertyChanged(this, e);
        }
    }

    #endregion
}
person Eriawan Kusumawardhono    schedule 30.09.2011

Вы можете привязать его к перечислению, если не хотите использовать программный код.

person Ritch Melton    schedule 30.09.2011