如何在同一命名空间内的不同类中调用VisualWebPart(.cs)中的C#方法

时间:2012-11-12 18:55:46

标签: c# sharepoint

我是C#和Sharepoint Programming的新手。

我正在尝试了解其上使用的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();
}

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

Object reference not set to an instance of an object.

有人可以告诉我该怎么办?

1 个答案:

答案 0 :(得分: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);
}

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

几个旁注:

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