我在两个 Web 部件(提供者和消费者)之间传输类对象时遇到一些困难。基本上,每当我尝试构建我的项目时,我都会收到此错误:

“ConnectableWebParts.LinkBut​​tonProvider.LinkBut​​tonProvider”未实现接口成员“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 继承。

现在它完全按照我想要的方式工作了。我希望其他人可以使用这些信息。enter image description here

有帮助吗?

解决方案 2

哈哈哈!

事实证明,在处理类对象时,我什至不需要使用接口。
处理原始对象(字符串、整数、长整型等)或 OOTB Web 部件时似乎需要一个接口。

因此,我只是从项目中删除了该接口,替换了对类名本身的所有调用,并将我的 Provider 设置为仅从 WebPart 继承。

现在它完全按照我想要的方式工作了。我希望其他人可以使用这些信息。enter image description here

其他提示

我可能完全不同意这一点,但我认为你必须确保你的对象(类)支持序列化。

基本序列化需要使用 [Serializable] 属性标记类,但您可能需要更高级的东西。请参阅此处了解更多详细信息: http://msdn.microsoft.com/en-us/library/4abbf6k0%28v=vs.90%29.aspx

无论如何,使用基本序列化都足够快,可以尝试。

许可以下: CC-BY-SA归因
scroll top