【问题标题】:DotNetNuke: ObjectDataSource for GridView not being foundDotNetNuke:未找到 GridView 的 ObjectDataSource
【发布时间】: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 中看到了另一种方法,它在控制器中定义了&lt;asp:ObjectDataSource&gt;,这似乎允许设计器做更智能的事情,例如通过复选框添加功能删除按钮。在本教程的后面部分,我看到内联编辑也正在完成,这是我想要的功能。

所以我决定试一试。也就是说:

<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


    【解决方案1】:

    更改您的对象数据源声明以匹配您的更新方法:

    public void UpdateDiscovery(DiscoveryInfo objDiscovery)

    在更新参数声明中使用单个参数:

    <UpdateParameters>
            <asp:Parameter Name="objDiscovery" />
        </UpdateParameters>
    
    使用对象数据源的更新事件从现有控件集中创建对象并将其分配给参数的默认值。

    祝你好运

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多