2

私はサードパーティのシステムを使用して、Web サイトにいくつかのフォームを実装しています。

サードパーティのシステムは、これらのフォームの XML 定義を提供してくれます。例えば

<form>
    <segment>
        <label>The header</label>
        <fields>
            ...
            <field>
                <id>field_Dob</id>
                <type>Date</type>
                <label>Date of Birth</label>
                <required>1</required>
            </field>
            ...
        </fields>
    </segment>
    ...
</form>

サーバー コントロールでこの XML を解析し、プログラムでコントロールのツリーを生成しています。コントロールのラベルは XML で渡されます。

小さなヘルプ テキストをこのフォームに「挿入」するのは、私たちの提案の一部です。

理想的には、トップ レベル コントロールのマークアップからこれらのヘルプ テキストを渡して、非開発者 (HTML モンキー) がヘルプ テキストを変更し、ID によってフィールドに関連付けることができるようにしたいと考えています。みたいなこと

<controls:MyCrazyForm runat="server">
    <helpTexts>
        <helpText for="field_Dob">
Some rambling nonsense to do with the DOB field
        </helpText>
        ...
    </helpTexts>
</controls:MyCrazyForm>

コントロールは再帰的に解析されます。

フォームはセグメントごとにフィールドセットを作成し、フィールドセットはデータ型に応じて多くの FieldXXX (XXX = 日付、テキスト、コンボボックスなど) を作成します。

FieldXXX 型は div を作成し、いくつかの標準的な .net コントロール (TextBox、DropDownList など) を作成して実際にレンダリングします。この時点で、ヘルプ テキストを出力する必要があるのは、含まれている div 内です。

私の質問

これらのテキストを最上位のフォーム コントロールからコントロール ツリーの 3 レベルまたは 4 レベル下にあるこれらの子コントロールに取得する「最良の」方法は何ですか。

ページには、これらのフォームの 1 つだけが存在します。トップレベルのフォームをシングルトンにして、そのようにする必要がありますか...?

if(MyCrazyForm.Instance.HelpTexts.ContainsKey("theIdOfTheCurrentField"))
{
    this.HelpText = MyCrazyForm.Instance.HelpTexts["theIdOfTheCurrentField"];
}

フォームへの参照をツリーの下のすべてのコントロールに渡す必要がありますか (これは面倒です)。

私はこのアーキテクチャ (現時点ではうまく機能していますが) の私のアーキテクチャで何マイルも目標を達成していますか?別の実装方法を検討する必要がありますか?

ありがとう

4

7 に答える 7

1

最初はもっと複雑かもしれませんが、保守が簡単になります。xslプロセッサを介してxmlファイルを実行してみませんか?xsltファイルは、helptextsファイルのhelptextノードを対応するフィールドノードに割り当てます。

 <?xml version="1.0" encoding="ISO-8859-1"?>
<form>
    <segment>
        <label>The header</label>
        <fields>
            <field>
                <id>field_name</id>
                <type>string</type>
                <label>Name</label>
                <required>1</required>
            </field>
            <field>
                <id>field_Dob</id>
                <type>Date</type>
                <label>Date of Birth</label>
                <required>1</required>
            </field>
        </fields>
    </segment>
</form>

XSLTファイル:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/form/segment/fields/field[id='field_name']">
    <xsl:copy>
      <xsl:element name="helptext">This is a Name helptext.</xsl:element> 
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/form/segment/fields/field[id='field_Dob']">
    <xsl:copy>
      <xsl:element name="helptext">This is a Date of birth helptext.</xsl:element> 
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

    <xsl:template match="node() | text()">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

これを生成します:

<form>
    <segment>
        <label>The header</label>
        <fields>
            <field>
<helptext>This is a Name helptext.</helptext>
                <id>field_name</id>
                <type>string</type>
                <label>Name</label>
                <required>1</required>
            </field>
            <field>
<helptext>This is a Date of birth helptext.</helptext>
                <id>field_Dob</id>
                <type>Date</type>
                <label>Date of Birth</label>
                <required>1</required>
            </field>
        </fields>
    </segment>
</form>

このxmlファイルは以前と同じように解析できるようになりましたが、フォーム要素の生成と同時にヘルプテキストを取得できるようになりました。HTMLモンキーは、XSLTファイルを編集するだけで済みます。または、単に別のファイルを含めるだけです。

  <xsl:template match="/form/segment/fields/field[id='field_Dob']">
    <xsl:copy>
      <xsl:element name="helptext">
        <xsl:copy-of select="document('field_Dob.txt')"/> 
      </xsl:element> 
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

ここでXSLをオンラインで試すことができます

于 2009-07-15T20:29:34.157 に答える
0

特定のフィールドのヘルプテキストが必要な場合はいつでも発生するイベントをサーバーコントロールに作成できます。フォームはイベントハンドラーをフックしてそれに応答することができます。そうすれば、サーバーに情報へのアクセスを制御させるために、オブジェクトを渡す必要がなくなります。このために、3つのことを行う必要があります。

EventArgsクラスを作成します。

class HelpTextEventArgs : EventArgs
{
    public string Text { get; set; }
    public string FieldId { get; private set; }
    public HelpTextEventArgs(string fieldId)
    {
        FieldId = fieldId;
    }
}

サーバーコントロールでイベントを作成します。

public event EventHandler<HelpTextEventArgs> HelpTextRequested;

protected void OnHelpTextRequested(HelpTextEventArgs e)
{
    EventHandler<HelpTextEventArgs> evt = this.HelpTextRequested;
    if (evt != null)
    {
        evt(this, e);
    }
}
// wrapper for the event raising method for easier access in the code
public string GetHelpText(string fieldId)
{
    HelpTextEventArgs e = new HelpTextEventArgs(fieldId);
    OnHelpTextRequested(e);
    return e.Text;
}

...ヘルプテキストにアクセスできるフォームでイベントハンドラーを設定します。

private void Page_Load(object sender, EventArgs e)
{
    ServerControl.HelpTextRequested += ServerControl_HelpTextRequested;
}

private void ServerControl_HelpTextRequested(object sender, HelpTextEventArgs e)
{
    e.Text = FindHelpText(e.FieldId);
}

このアプローチを使用すると、ホスティングフォームがヘルプテキストサービスを提供していなくても、コードは正常に機能します。サーバー制御は、イベントハンドラーが接続されているという事実に依存していません。

于 2009-07-15T18:07:45.753 に答える
0

Ozam が提案したように、XSL を使用できます。

XMLノードごとにhelpTextを含むサードパーティのxmlファイルと同様の構造を持つ別のXMLファイルが適切であり、何らかの方法でそれらをマージ(?)する必要がある場合があります。

これが何らかの形で役立つかどうかはわかりません。

于 2009-07-18T20:14:15.843 に答える
0

このようなインターフェースを作成することをお勧めします

interface IHelpTextProvider
{
    Dictionary<string, string> HelpTexts
    {
        get;
    }
}

その後、フォーム コントロールはこのインターフェイスを実装し、フィールドセットと FieldXXX コントロールを作成するときにこのインターフェイスへの参照を渡すことができます。

別の方法として、polyglot が提案するように行うこともできます。ヘルプ テキストが必要な場合、FieldXXX コントロールは、IHelpTextProvider インターフェイスを実装する親が見つかるまで、その親を再帰的に通過します。

于 2009-07-14T19:19:12.907 に答える