DotNetNuke: ObjectDataSource для GridView не найден - PullRequest
2 голосов
/ 25 января 2011

Как продолжение предыдущего вопроса о GridView и DotNetNuke, у меня возникло немного больше проблем, чтобы заставить вещи действовать правильно.Прямо сейчас у меня есть простой GridView в моем файле ascx, и я связываю данные с GridView в моем файле .cs следующим образом:

DiscoveryController objDiscoverys = new DiscoveryController();
List<DiscoveryInfo> lstDiscoveries = objDiscoverys.GetDiscoverys(ModuleId);

grdDiscoverys.DataSource = lstDiscoveries;
grdDiscoverys.DataBind();

Это работает.Тем не менее, я видел альтернативный метод в учебнике , который вместо этого определяет <asp:ObjectDataSource> в контроллере, и это, кажется, позволяет Дизайнеру делать более интеллектуальные вещи, такие как добавление функциональных кнопок Delete через флажок,Позже в этом уроке я также вижу, как выполняется встроенное редактирование, и это именно то, что мне нужно.

Так что я решил попробовать.То есть:

<asp:ObjectDataSource ID="objDataSource" runat="server" TypeName="MyCompany.Modules.Discovery.DiscoveryController" />

Поскольку мой dll-файл в папке bin называется MyCompany.Modules.Discovery (который соответствует имени сборки и пространству имен по умолчанию, которое я настроил в своем проекте C #), это имеет смысл,Как говорится в руководстве, я затем использовал конструктор, чтобы попытаться связать источник данных с GridView.

Однако я получаю сообщение об ошибке, что его нельзя загрузить.Имена пространств имен и имен классов совпадают, и я могу четко связать их с задним кодом, так что же дает?

РЕДАКТИРОВАТЬ: продолжение.После некоторых экспериментов я обнаружил, что, хотя Designer не видит мой модуль, сам шаблон .ascx может это видеть.Помещение этого в мой файл .ascx, кажется, работает ... по большей части:

<asp:ObjectDataSource ID="objDataSource" runat="server" TypeName="MyCompany.Modules.Discovery.DiscoveryController" SelectMethod="GetDiscoverys" UpdateMethod="UpdateDiscovery" DeleteMethod="DeleteDiscovery">
    <SelectParameters>
        <asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
    </SelectParameters>
    <UpdateParameters>
        <asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
    </UpdateParameters>
    <DeleteParameters>
        <asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
    </DeleteParameters>
</asp:ObjectDataSource>
<asp:GridView ID="grdDiscoverys" runat="server" DataSourceID="objDataSource" EnableModelValidation="True" AutoGenerateColumns="false" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" DataKeyNames="ItemId">
    <Columns>
        <asp:BoundField DataField="ItemId" HeaderText="#" ReadOnly="true" />
        <asp:BoundField DataField="Title" HeaderText="Title" />
        <asp:BoundField DataField="Image" HeaderText="Image URL" />
        <asp:BoundField DataField="Link" HeaderText="Link" />
    </Columns>
</asp:GridView>

Фантастика ... похоже, я отразил большую часть функциональности того, что добавил бы Дизайнер.... за исключением одной маленькой вещицы.Автоматическое обновление не обновляется.

Более конкретно, я получаю это сообщение при попытке обновить поле:

ObjectDataSource 'objDataSource' could not find a non-generic method 'UpdateDiscovery' that has parameters: ModuleId, Title, Image, Link, ItemId.

Конечно, это не работает!Сигнатура метода выглядит следующим образом:

public void UpdateDiscovery(DiscoveryInfo objDiscovery)

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

1 Ответ

0 голосов
/ 04 августа 2011

Измените объявление источника данных объекта в соответствии с вашим методом обновления:

public void UpdateDiscovery(DiscoveryInfo objDiscovery)

Используйте один параметр в объявлении параметра обновления:

<UpdateParameters>
        <asp:Parameter Name="objDiscovery" />
    </UpdateParameters>
используйте событие обновления источника данных объекта для создания объекта из существующего набора элементов управленияи присвойте ему значение по умолчанию для параметра.

Удачи

...