asp.net中ObjectDataSource“”未能找到带参数的非泛型方法“DelnewsClass”: p1, id 问题
asp.net真是让人欢喜让人忧,明明一个很智能,很nice的ObjectDataSource的listView工具,却搞个参数问题来困扰人
我用的是ObjectDataSource,然后用listView,希望智能生成一个增删改删.结果可以查出,但删除都报类似标题的错误.
查了很久,发现它问题就出在这两个文件中
数据列表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> </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需要展现的部分又是不行的,应该是自动生成是名子就起好了.所以改起来,还是个二百五.反正记得三个都得一样一样的就行了.碎觉