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

And*_*les 5 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();
        }
    }            
}
Run Code Online (Sandbox Code Playgroud)

这被称为:

protected void Button1_Click(object sender, EventArgs e)
{
    TestMethod();
}
Run Code Online (Sandbox Code Playgroud)

这很好用.我试图在第二个WebPart上使用相同的方法,它做同样的事情(添加项目).

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

protected void Button1_Click(object sender, EventArgs e)
{
    VWP1 NewClass = new VWP1();
    NewClass.TestMethod();
}
Run Code Online (Sandbox Code Playgroud)

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

Object reference not set to an instance of an object.

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

Ser*_*rvy 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();
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将该方法放入实用程序类中的某个位置。

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

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

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

几个旁注:

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