Как продолжение предыдущего вопроса о 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)
На данный момент, я настолько близок к тому, чтобы получить что-то работающее, что я могу попробовать его, и, черт побери, я собираюсь изменить функцию так,он принимает эти пять точных параметров вместо объекта данных.Тем не менее, учебник, на который я ссылался выше, как-то убедил автоматическое обновление передать объект данных, поэтому мне любопытно узнать, как ему это сошло с рук.