【发布时间】:2011-01-25 17:53:39
【问题描述】:
作为previous question 关于 GridView 和 DotNetNuke 的后续行动,我在让事情正确运行时遇到了一些麻烦。现在我的 ascx 文件中有一个简单的 GridView,我将数据绑定到 .cs 文件中的 GridView,如下所示:
DiscoveryController objDiscoverys = new DiscoveryController();
List<DiscoveryInfo> lstDiscoveries = objDiscoverys.GetDiscoverys(ModuleId);
grdDiscoverys.DataSource = lstDiscoveries;
grdDiscoverys.DataBind();
这行得通。但是,我在tutorial 中看到了另一种方法,它在控制器中定义了<asp:ObjectDataSource>,这似乎允许设计器做更智能的事情,例如通过复选框添加功能删除按钮。在本教程的后面部分,我看到内联编辑也正在完成,这是我想要的功能。
所以我决定试一试。也就是说:
<asp:ObjectDataSource ID="objDataSource" runat="server" TypeName="MyCompany.Modules.Discovery.DiscoveryController" />
因为我在 bin 文件夹中的 dll 文件被命名为 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)
在这一点上,我已经非常接近让我可以品尝到它的工作了,而 DAL-be-damned 我即将更改函数,因此它需要这五个确切的参数而不是数据对象。但是,我上面引用的教程似乎以某种方式说服了自动更新传递数据对象,所以我很想知道它是如何逃脱的。
【问题讨论】:
标签: asp.net gridview dotnetnuke objectdatasource