5

我对 C# 和 Sharepoint 编程非常陌生。

我正在尝试了解其上使用的 WebPart 和 C#。我制作了一个可视化的 webpart,可以在列表中添加/删除项目。我有一个在单击按钮时调用的方法,该方法在列表中添加项目。

这是我的方法:

public void TestMethod()
{
    using (SPSite oSPSite = SPContext.Current.Site)
    {
        using (SPWeb ospweb = oSPSite.OpenWeb())
        {
            SPList lst = ospweb.Lists["CusomList1"];

            SPListItem item = lst.Items.Add();

            item["Item1"] = txt1.Text;
            item["Item2"] = txt3.Text;
            item["Item3"] = Convert.ToInt32(txt3.Text);
            item["Item4"] = txt4.Text;
            item.Update();
        }
    }            
}

这被称为:

protected void Button1_Click(object sender, EventArgs e)
{
    TestMethod();
}

这很好用。我正在尝试在执行相同操作(添加项目)的第二个 WebPart 上使用相同的方法。

但是,当我在同一个项目中添加一个新的 Visual Webpart 并将类和方法称为

protected void Button1_Click(object sender, EventArgs e)
{
    VWP1 NewClass = new VWP1();
    NewClass.TestMethod();
}

此添加按钮不起作用,当我进行调试时,我收到以下消息:

你调用的对象是空的。

有人可以告诉我该怎么做吗?

4

1 回答 1

1

您需要做的是将保存列表中的项目的逻辑与与用户界面交互的逻辑分开。

制作一个单独的函数来获取要保存的数据并保存它:

public static void SaveItem(string item1, string item2, int item3, string item4)//TODO rename parameters
{
    SPListItem newItem = SPContext.Current.Web.Lists["CusomList1"].AddItem();
    //set fields of new item
    newItem.Update();
}

然后,您可以将该方法放在某个实用程序类中。

完成后,您可以从每个 Web 部件调用该方法:

protected void Button1_Click(object sender, EventArgs e)
{
    MyUtilityClass.SaveItem(txt1.Text, txt2.Text, Convert.ToInt32(txt3.Text), txt4.Text);
}

至于为什么,这里发生了很多事情。主要问题是,当您创建第一个可视 Web 部件的新实例并调用该方法时,它不会访问第二个 Web 部件的文本框值,而是访问新创建的 Web 部件的文本框值;从未向用户展示过或由 ASP 初始化的那个。因为 ASP(或您)从未调用它的初始化函数,所以文本框字段全部为空,因此您的错误。如果您确实对其进行了初始化,那么它们都会有空的文本值,但它仍然对您没有帮助。与文本框的交互需要在每个不同的 Web 部件中进行;你不能(或者至少不应该;允许它是不好的做法)从另一个类访问内部控制。除了实际的 UI 交互之外,您可以转移到另一个类的所有内容;在这种情况下,将项目保存到列表中。

几个旁注:

  • 您将当前上下文的 SPSite 放在一个using块中;这将处理它。 不要那样做。仅处置您创建的站点/Web 对象。当前上下文的站点/网络对象被重新用于不同的请求;如果您处置它,该请求将起作用,但是当处置的对象传递给下一个请求时,它将中断,并且由于问题完全出在另一个请求中,因此通常难以调试错误。
  • 在该示例中,您打开了一个新网络;您确定当前上下文的网络不合适吗?如果不是,并且您确实想要根网站并且不会总是在根网站上,您可以使用SPContext.Current.Web.RootWeb它来访问它而无需打开一个新网站。
  • 您正在使用Convert.ToInt32用户提供的值。如果他们没有输入正确的数字,如果他们包含逗号等,这将中断。考虑使用int.TryParse,以便在他们输入无效值时更优雅地失败。
  • 您不应该使用list.Items.Add()来添加项目;你应该使用list.AddItem(). Items.Add被认为已弃用。
于 2012-11-12T19:05:32.307 回答