asp.net中ObjectDataSource“”未能找到带参数的非泛型方法“DelnewsClass”: p1, id 问题

asp.net真是让人欢喜让人忧,明明一个很智能,很nice的ObjectDataSource的listView工具,却搞个参数问题来困扰人

我用的是ObjectDataSource,然后用listView,希望智能生成一个增删改删.结果可以查出,但删除都报类似标题的错误.

查了很久,发现它问题就出在这两个文件中

asp.net中ObjectDataSource“”未能找到带参数的非泛型方法“DelnewsClass”: p1, id 问题

数据列表1.aspx文件中的

 <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DataObjectTypeName="MyWebApplication.增删改查.App_Data.DataSetUser" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" SelectMethod="GetData" TypeName="MyWebApplication.增删改查.App_Data.DataSetUserTableAdapters.t_userTableAdapter" UpdateMethod="Update">
            <InsertParameters>
                <asp:Parameter Name="p1" Type="Int32" />
                <asp:Parameter Name="p2" Type="String" />
                <asp:Parameter Name="p3" Type="Int32" />
                <asp:Parameter Name="p4" Type="Int32" />

            </InsertParameters>
        </asp:ObjectDataSource>


OldValuesParameterFormatString 这个我感觉可以看作是往下面一串红的地方传参数的,所以这个可以设为{0} 不知道为啥自动生成还加了个玩意搞破坏

asp:Parameter Name  这个的值要和上面传进来的一致,但是显示自动生成的也不一致


DataSetStudents.Designer.cs这个文件中看

 public virtual int Insert(string p1, int p2, string p3, int p4) {
            if ((p1== null)) {
                throw new global::System.ArgumentNullException("p1");
            }
            else {
                this.Adapter.InsertCommand.Parameters[0].Value = ((string)(p1));
            }
            this.Adapter.InsertCommand.Parameters[1].Value = ((int)(p2));
            if ((p3== null)) {
                throw new global::System.ArgumentNullException("p3");
            }
            else {
                this.Adapter.InsertCommand.Parameters[2].Value = ((string)(p3));
            }
            this.Adapter.InsertCommand.Parameters[3].Value = ((int)(isVip));
            global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;
            if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open)
                        != global::System.Data.ConnectionState.Open)) {
                this.Adapter.InsertCommand.Connection.Open();
            }
            try {
                int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
                return returnValue;
            }
            finally {
                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
                    this.Adapter.InsertCommand.Connection.Close();
                }
            }
        }

这个文件里的形参,要和上面保持一致. 说实在的,这个不理解为何形参也要保证名称一致

我有试过把数据列表1.aspx文件一致,但还是跑不过,人家就这样了.修改如下

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="Delete" InsertMethod="Insert" OldValuesParameterFormatString="{0}" SelectMethod="GetData" TypeName="MyWebApplication.增删改查.App_Data.DataSetStudentsTableAdapters.t_studentsTableAdapter" UpdateMethod="Update">
            <DeleteParameters>
                <asp:Parameter Name="id" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="name" Type="String" />
                <asp:Parameter Name="age" Type="Int32" />
                <asp:Parameter Name="gender" Type="String" />
                <asp:Parameter Name="isVip" Type="Int32" />
            </InsertParameters>


 public virtual int Insert(string name, int age, string gender, int isVip)

这样就可以保持一致了.可以运行了.


但是这种改法,完全是把一个很智能的东东改得跟个二百五似的.所以换一种改法,在OldValuesParameterFormatString 想办法改改成传进去的参数就是p1,p2啥的

那就把

<EditItemTemplate>
                <tr style="background-color: #FFCC66;color: #000080;">
                    <td>
                        <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" />
                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="取消" />
                    </td>
                    <td>
                        <asp:Label ID="idLabel1" runat="server" Text='<%# Eval("id") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="nameTextBox" runat="server" Text='<%# Bind("name") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="ageTextBox" runat="server" Text='<%# Bind("age") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="genderTextBox" runat="server" Text='<%# Bind("gender") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="isVipTextBox" runat="server" Text='<%# Bind("isVip") %>' />
                    </td>
                </tr>
            </EditItemTemplate>


改成类似

<InsertItemTemplate>
                <tr style="">
                    <td>
                        <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="插入" />
                        <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="清除" />
                    </td>
                    <td>&nbsp;</td>
                    <td>
                        <asp:TextBox ID="nameTextBox" runat="server" Text='<%# Bind("p1") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="ageTextBox" runat="server" Text='<%# Bind("p2") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="genderTextBox" runat="server" Text='<%# Bind("p3") %>' />
                    </td>
                    <td>
                        <asp:TextBox ID="isVipTextBox" runat="server" Text='<%# Bind("p4") %>' />
                    </td>
                </tr>
            </InsertItemTemplate>

发现有部分是可以的,但是Eval,Bind需要展现的部分又是不行的,应该是自动生成是名子就起好了.所以改起来,还是个二百五.反正记得三个都得一样一样的就行了.碎觉