Web パーツ間でクラス オブジェクトを送信する
-
10-12-2019 - |
質問
2 つの Web パーツ (プロバイダーとコンシューマー) 間でクラス オブジェクトを送信するのに問題があります。基本的にプロジェクトをビルドしようとすると必ず次のエラーが発生します。
「ConnectableWebParts.LinkButtonProvider.LinkButtonProvider」はインターフェイス メンバー「ConnectableWebParts.ISalObject.SalItem」を実装していません
文字列などのプリミティブオブジェクトを使用してこれを実現しましたが、何らかの理由で、3つ以上の文字列変数を持つクラスの送信に問題が発生します。
不足しているものがないかどうかを確認するために、これまでの例をいくつか確認しましたが、すべて正しいようです。したがって、プリミティブオブジェクトの転送とクラスオブジェクトの転送の間には、何らかの固有の違いがあると思います。
本当にもう 2 つ目の目を使用できるか、誰かが以前にこれを実行したことがあれば、それは素晴らしいでしょう。お時間をいただきありがとうございます。
以下の解決策。
インターフェース
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;
}
}
}
}
編集:ハハハハ!
クラスオブジェクトを扱うときは、インターフェイスを使用する必要さえないことがわかりました。
プリミティブ オブジェクト (string、int、long など) または OOTB Web パーツを処理する場合は、インターフェイスが必要になるようです。
そこで、プロジェクトからインターフェイスを削除し、クラス名自体への呼び出しをすべて置き換え、WebPart からのみ継承するようにプロバイダーを設定しました。
今では私が望んでいたとおりに動作します。他の人もこの情報を活用できることを願っています。
解決 2
ハハハハ!
クラスオブジェクトを扱うときは、インターフェイスを使用する必要さえないことがわかりました。
プリミティブ オブジェクト (string、int、long など) または OOTB Web パーツを処理する場合は、インターフェイスが必要になるようです。
そこで、プロジェクトからインターフェイスを削除し、クラス名自体への呼び出しをすべて置き換え、WebPart からのみ継承するようにプロバイダーを設定しました。
今では私が望んでいたとおりに動作します。他の人もこの情報を活用できることを願っています。
他のヒント
これについては完全に間違っているかもしれませんが、オブジェクト(クラス)がシリアル化をサポートしていることを確認する必要があると思います。
基本的なシリアル化では、クラスを [Serializable] 属性でマークする必要がありますが、より高度なことが必要になる場合があります。詳細については、こちらを参照してください。 http://msdn.microsoft.com/en-us/library/4abbf6k0%28v=vs.90%29.aspx
いずれの場合でも、基本的なシリアル化を使用すればすぐに試すことができます。