SPFieldText から継承するカスタム フィールドの作成に成功し、入力フォームでのコントロールとしてのレンダリングを完全に制御できるようになりました。
問題:
GetFieldValueAsHtml() を使用してフィールドをレンダリングするときに、クエリ文字列に ListId と ListitemID を含むポップアップへのリンクを作成する必要があります。
このようなもの:
public class CustomField : SPFieldText
{
public CustomField (SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}
public CustomField (SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}
public override string GetFieldValueAsHtml(object value)
{
return string.Format(
"javascript:window.open('{0}/_layouts/Popup.aspx?ListId={1}&ItemId={2}','Popup','status=0,scrollbars=0,titlebar=0,resizable=1,toolbar=0,location=0,width=600,height=500');return false;",
SPContext.Current.Web.ServerRelativeUrl.TrimEnd('/'),
LISTID, LISTITEM.ID
);
}
明らかに、SPContext はリストまたはアイテムへの参照を保持しておらず、どのプロパティも現在のアイテムを公開していないようです。コントロールでプロパティをオーバーロードしようとしましたが、フィールドをレンダリングするときに呼び出されないようです。
// None of these properties are invoked when rendering the field as above
public class CustomFieldControl : TextField
{
public override object ItemFieldValue
public override object ListItemFieldValue
public override string Text
public override object Value
}
fldtypes_Custom.xml で RenderPattern を試してみましたが、これも GetFieldValueAsHtml(); を使用してフィールドをレンダリングするときに無視されます。
私は単純に不可能なことを期待していますか? 私は、Web パーツの書き換えを回避するアプローチを受け入れます... または、それはできないとだけ言ってください。
(既存の Web パーツはグリッドをレンダリングし、GetFieldValueAsHtml() を呼び出します。これを実現するために Web パーツを変更できることはわかっていますが、それは他の理由から理想的なソリューションではありません)。