对象引用是必需的“ProductService”

时间:2012-01-24 14:31:48

标签: c# asp.net

我在尝试使用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");
        }
    }

我似乎无法弄清楚问题是什么,任何回应都不仅仅是值得赞赏。

3 个答案:

答案 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)