5

カスタムWebControlUserControlControlおよびさまざまな Render メソッドをオーバーライドする必要がある場合、これを実現するには主に 2 つの方法があります。

迅速で汚い:

public override void RenderControl(HtmlTextWriter writer)
{
    writer.Write("<div class=\"{0}\"><a href={1}>{2}</a>", CssClass, "/someurl.aspx", LocalizedStrings.EditLinkText);
    base.RenderControl(writer);
    writer.Write("</div>");
}

長くてきれい:

public override void RenderControl(HtmlTextWriter writer)
{
    writer.WriteBeginTag(HtmlTextWriterTag.Div.ToString());
    writer.WriteAttribute(HtmlTextWriterAttribute.Class.ToString(), CssClass);
    writer.Write(HtmlTextWriter.TagRightChar);
    var link = new HtmlAnchor();
    link.HRef = "/someurl.aspx";
    link.Title = LocalizedStrings.EditLinkTitle;
    link.InnerText = LocalizedStrings.EditLinkText; ;
    link.Attributes.Add(HtmlTextWriterAttribute.Class.ToString(), "someclass");
    link.RenderControl(writer);
    base.RenderControl(writer);
    writer.WriteEndTag(HtmlTextWriterTag.Div.ToString());
}

2番目の方法が価値があるかどうか疑問に思っていました。

4

3 に答える 3

1

Web コントロールを開発していたとき、私は一度その質問を自問しました。それを解決するために、テレリックのライブラリを逆コンパイルしてから、それらが Web コントロールを実装する方法を確認しました。彼らは多くのコンポーネントを開発し、2 番目の近似を使用します。

私の意見では、コントロールが複雑な場合、コードが多くの string.format などになり、理解と変更が困難になる可能性があるため、これが最良のオプションです。もちろん、2 番目のオプションも不明確かもしれませんが、ユーティリティ メソッドをほとんど使用せずに、保守性の高いコントロールを作成できます。

于 2014-11-25T21:45:34.183 に答える
1

この場合、最初のアプローチがよりクリーンで単純なケースにより適していることに同意しますが、出力を正しくするためのより多くの責任を伝えます。たとえば、文字列リテラルの代わりにリンク ターゲット URL のパラメーター値を使用する必要がある場合、文字列を作成するときに、適切にエンコード (エスケープ文字など) されていることを確認する必要がありますが、HtmlAnchorクラスはそれを処理します。あなたは自動的に。

于 2014-02-21T17:17:05.203 に答える