0

継承するカスタム コントロールがあります。System.Web.UI.WebControls.WebControl

コントロールがレンダリングされたときに追加style="display:inline-block;"

私は Me.Style.Remove("display") Me.Style["display"]="something"他の同様のものを使用しますが、このコードは持続します。

この単純なコントロールで同じ動作を確認できます。

    public class HomeLink : System.Web.UI.WebControls.WebControl {
    protected override void OnPreRender(EventArgs e) {
        this.Attributes["style"] = "aaaa";
        base.OnPreRender(e);
        this.Attributes["style"] = "bbb";
    } }

そして、このコードビハインド:

    <FC:HomeLink ID="HomeLink1" runat="server" width="100px" />

そして、次のようにレンダリングします。

    <span id="HomeLink1" style="display:inline-block;width:100px;bbb"></span>
4

5 に答える 5

2

リフレクタを使用すると、各コントロールがタグ「span」および「a」を使用してレンダリングされた Web コントロールを継承することがわかります。

Protected Overridable Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
    ...
    If (Me.TagKey = HtmlTextWriterTag.Span OrElse Me.TagKey = HtmlTextWriterTag.A) Then
        Me.AddDisplayInlineBlockIfNeeded(writer)
    End If
    .....
End Sub

Friend Sub AddDisplayInlineBlockIfNeeded(ByVal writer As HtmlTextWriter)
    Dim isEmpty As Boolean = False
    If (Not Me.RequiresLegacyRendering OrElse Not MyBase.EnableLegacyRendering) Then
        If (Me.BorderStyle = BorderStyle.NotSet) Then
            Dim borderWidth As Unit = Me.BorderWidth
            If (borderWidth.IsEmpty) Then
                Dim height As Unit = Me.Height
                If (height.IsEmpty) Then
                    Dim width As Unit = Me.Width
                    isEmpty = width.IsEmpty
                End If
            End If
        End If
        If (Not isEmpty) Then
            writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "inline-block")
        End If
    End If
End Sub

スタイルの適用を避けるにdisplay:inline-blockは、2 つのオプションがあります

1- 次のコードを web.config に追加して、レガシー レンダリングを強制します。

<system.web>
    <xhtmlConformance mode="Legacy"/>
</system.web>

2-メソッドAddAttributesToRenderをオーバーライドし、変数で幅を取得し、コントロールの幅を空の値に設定してから、base.AddAttributesToRender(writer)を実行し、設定されている場合は幅を追加します

protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
{
    Unit width = this.Width;
    this.Width = new Unit();

    base.AddAttributesToRender(writer);

    if (!width.IsEmpty)
        writer.AddStyleAttribute("width", width.ToString);
}
于 2014-03-05T13:57:56.130 に答える
0

それが機能する属性を使用してください..

Me.Attributes["style"] = "display:inline-block;";
于 2013-09-12T12:11:22.003 に答える
0

Style クラスには Remove() メソッドはありません。このMSDNリンクを確認してください。

于 2013-09-12T12:03:44.610 に答える
0

より洗練されたソリューションがないため、render メソッドをオーバーライドできます。

      protected override void Render(System.Web.UI.HtmlTextWriter writer)
      {
          //Create a new HtmlTextWriter to render the original control output
          var sb = new System.Text.StringBuilder();
          System.IO.TextWriter textWriter = new System.IO.StringWriter(sb);
          System.Web.UI.HtmlTextWriter preWriter = new System.Web.UI.HtmlTextWriter(textWriter);
          base.Render(preWriter);

          //Here you can modify any output content
          sb.Replace("display:inline-block;", "");

          //Finally write control writer
          writer.Write(sb);
      }

私はあなたのコードを試してみましたが、動作します! お役に立てれば幸いです。

于 2013-09-26T15:44:42.417 に答える
0

また、コントロールの幅と高さが空であることを確認することもできます (可能な場合)。これは、スパンとアンカーが高さまたは幅を持たないインライン コントロールであるためです。そのため、WebControl の表示がインライン ブロックに変更され、高さまたは幅が適用されます。ユーザーコントロールに。

コントロールに高さと幅が必要な場合は、コンストラクターとして使用して、タグに DIV があると宣言できます。

public HomeLink ()
: base(HtmlTextWriterTag.Div)
{
}
于 2014-04-29T18:19:24.563 に答える