我在尝试使用OOP(第一次)时遇到以下错误,在我的aspx页面上显示产品列表。 ProductService.cs从我的ProductService.cs文件中读取查询和参数,但不幸的是,这行代码似乎存在问题:
ProductService.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
错误:
CS0120:非静态字段需要对象引用, 方法或属性'ProductService.SaveProduct(int?,string,int, 字符串,十进制,十进制)'
Aspx.cs:
protected void BtnUpdateOrCreate_Click(object sender, EventArgs e)
{
// Text in fields has to exist, if they are requierd
if (!string.IsNullOrWhiteSpace(TxtName.Text) /*&&
!string.IsNullOrWhiteSpace(TxtDescription.Text)*/)
{
// TODO: Be sure to parse the decimals using TryParse before
int? id = isCreate ? null : (int?)ProductID;
ProductService productService = new ProductService();
ProductService.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
// Redirects to list
Response.Redirect(Request.Url.AbsolutePath);
}
ProductService.cs:
public void SaveProduct(int? id, string name, int categoryID, string description, decimal unitPrice, decimal discountUnitPrice)
{
dataAccess.AddParameter("@Name", name);
dataAccess.AddParameter("@Category_ID", categoryID);
dataAccess.AddParameter("@Description", description.ToNewline(false));
dataAccess.AddParameter("@UnitPrice", unitPrice);
dataAccess.AddParameter("@DiscountUnitPrice", discountUnitPrice);
if (!id.HasValue)
{
// Insert query
dataAccess.Execute(@"INSERT INTO [Product] ([Name], [Category_ID], [UnitPrice], [DiscountUnitPrice], [Description])
VALUES (@Name, @Category_ID, @UnitPrice, @DiscountUnitPrice, @Description)");
}
else
{
// Update query
dataAccess.AddParameter("@id", id.Value);
dataAccess.Execute(@"UPDATE [Product]
SET [Name] = @Name, [Category_ID] = @Category_ID, [UnitPrice] = @UnitPrice, [DiscountUnitPrice] = @DiscountUnitPrice, [Description] = @Description
WHERE id = @id");
}
}
我似乎无法弄清楚问题是什么,任何回应都不仅仅是值得赞赏。
答案 0 :(得分:1)
更改此行
ProductService.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
到这个
productService.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
您正在调用类名ProductService
和方法名称(就好像它是静态方法)而不是您创建的实例productService
。
答案 1 :(得分:0)
ProductService.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
应该是
productService.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
您正在实例化该类,但之后您没有使用实例化变量,在使用区分大小写的语言时常见错误。注意visual studio中不同对象的不同颜色。
替代方法是更改方法:SaveProduct到static,但是如果选择此方法,那么您在SaveProduct方法中使用的ProductService类中的所有私有变量也必须是静态的。而是整个班级static。
答案 2 :(得分:0)
我假设ProductService
是类名 - 不是变量。
您应该创建类的实例以使用它的方法:
ProductService srv = new ProductService();
srv.SaveProduct(id, TxtName.Text, Int32.Parse(DDCategories.SelectedValue), TxtDescription.Text, Decimal.Parse(TxtPrice.Text), Decimal.Parse(TxtUnitDiscount.Text));
如果您想在发布时使用它,则应在方法签名中添加static
:
public static void SaveProduct(int? id, string name, int categoryID, string description, decimal unitPrice, decimal discountUnitPrice)