在 Web 部件之间发送类对象
-
10-12-2019 - |
题
我在两个 Web 部件(提供者和消费者)之间传输类对象时遇到一些困难。基本上,每当我尝试构建我的项目时,我都会收到此错误:
“ConnectableWebParts.LinkButtonProvider.LinkButtonProvider”未实现接口成员“ConnectableWebParts.ISalObject.SalItem”
我已经使用字符串等原始对象实现了这一点,但由于某种原因,它在传输具有 3 个以上字符串变量的类时出现问题。
我查看了之前的一些示例,看看是否缺少某些内容,但看起来一切都是正确的。所以我假设传输原始对象和传输类对象之间存在一些独特的区别。
真的可以使用第二双眼睛,或者如果有人以前这样做过那就太好了。感谢您的时间。
解决方案如下。
界面
namespace ConnectableWebParts
{
public interface ISalObject
{
SalObject SalItem { get; set; }
}
}
班级
namespace ConnectableWebParts
{
public class SalObject
{
private string name;
private string description;
private string code;
public string Name { get { return name; } set { name = value; } }
public string Description { get { return description; } set { description = value; } }
public string Code { get { return code; } set { code = value; } }
public SalObject() {
name = "";
description = "";
code = "000000";
}
public void storeDate()
{
Name = "John Doe";
Description = "Good Omen";
Code = "111111";
}
}
}
提供者
namespace ConnectableWebParts.LinkButtonProvider
{
[ToolboxItemAttribute(false)]
public partial class LinkButtonProvider : WebPart, ISalObject
{
private SalObject _salvage = new SalObject();
[Personalizable()]
public SalObject Salvage {
get { return _salvage; }
set { _salvage = value; }
}
[ConnectionProvider("Provider for SalObject From LinkButton", "SalObjectProvider")]
public ISalObject SalObjectProvider()
{
return this;
}
public LinkButtonProvider()
{
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
InitializeControl();
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
Salvage = new SalObject();
}
}
}
消费者
namespace ConnectableWebParts.LinkButtonConsumer
{
[ToolboxItemAttribute(false)]
public partial class LinkButtonConsumer : WebPart
{
private ISalObject _myProvider;
[ConnectionConsumer("SalObject Consumer", "SalObjectConsumer")]
public void SalvageConsumer(ISalObject Provider)
{
_myProvider = Provider;
}
public LinkButtonConsumer()
{
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
InitializeControl();
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void OnPreRender(EventArgs e)
{
EnsureChildControls();
if (_myProvider != null)
{
NameCell.Text = _myProvider.SalItem.Name;
DescCell.Text = _myProvider.SalItem.Description;
CodeCell.Text = _myProvider.SalItem.Code;
}
}
}
}
编辑:哈哈哈!
事实证明,在处理类对象时,我什至不需要使用接口。
处理原始对象(字符串、整数、长整型等)或 OOTB Web 部件时似乎需要一个接口。
因此,我只是从项目中删除了该接口,替换了对类名本身的所有调用,并将我的 Provider 设置为仅从 WebPart 继承。
现在它完全按照我想要的方式工作了。我希望其他人可以使用这些信息。
解决方案 2
哈哈哈!
事实证明,在处理类对象时,我什至不需要使用接口。
处理原始对象(字符串、整数、长整型等)或 OOTB Web 部件时似乎需要一个接口。
因此,我只是从项目中删除了该接口,替换了对类名本身的所有调用,并将我的 Provider 设置为仅从 WebPart 继承。
现在它完全按照我想要的方式工作了。我希望其他人可以使用这些信息。
其他提示
我可能完全不同意这一点,但我认为你必须确保你的对象(类)支持序列化。
基本序列化需要使用 [Serializable] 属性标记类,但您可能需要更高级的东西。请参阅此处了解更多详细信息: http://msdn.microsoft.com/en-us/library/4abbf6k0%28v=vs.90%29.aspx
无论如何,使用基本序列化都足够快,可以尝试。