作为关于GridView和DotNetNuke的previous question的后续行动,我在让事情正确行动方面遇到了一些麻烦。现在我在我的ascx文件中有一个简单的GridView,我将数据绑定到我的.cs文件中的GridView,如下所示:
DiscoveryController objDiscoverys = new DiscoveryController();
List<DiscoveryInfo> lstDiscoveries = objDiscoverys.GetDiscoverys(ModuleId);
grdDiscoverys.DataSource = lstDiscoveries;
grdDiscoverys.DataBind();
这很有效。但是,我在tutorial中看到了另一种方法,它在控制器中定义了<asp:ObjectDataSource>
,这似乎允许Designer做更多智能的事情,例如通过复选框添加功能删除按钮。在本教程的后面,我看到内联编辑也正在完成,这是我想要的功能。
所以我决定试一试。即:
<asp:ObjectDataSource ID="objDataSource" runat="server" TypeName="MyCompany.Modules.Discovery.DiscoveryController" />
由于我在bin文件夹中的dll文件名为MyCompany.Modules.Discovery(它与我在C#项目中设置的程序集名称和默认命名空间相匹配),这非常有意义。正如教程所说,然后我使用Designer尝试将数据源绑定到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>
太棒了......看起来我已经反映了Designer所添加的大部分功能......除了一个小小的东西。自动更新不会更新。
更具体地说,当我尝试更新字段时收到此消息:
ObjectDataSource 'objDataSource' could not find a non-generic method 'UpdateDiscovery' that has parameters: ModuleId, Title, Image, Link, ItemId.
当然不行!方法签名如下:
public void UpdateDiscovery(DiscoveryInfo objDiscovery)
此时,我已经非常接近工作了,我可以品尝它,DAL被诅咒我即将改变功能所以它需要那五个精确的参数而不是数据对象。但是,我上面引用的教程似乎以某种方式说服自动更新传递数据对象,所以我很想知道它是如何逃脱的。
答案 0 :(得分:0)
更改对象数据源声明以匹配更新方法:
public void UpdateDiscovery(DiscoveryInfo objDiscovery)
在更新参数声明中使用单个参数:
<UpdateParameters>
<asp:Parameter Name="objDiscovery" />
</UpdateParameters>
使用对象数据源的更新事件从现有控件集创建对象并将其分配给参数的默认值。祝你好运