3

これがHtmlHelperの設計を通じてコピーできるものなのか、それともRazor自体に組み込まれた特別なものなのかについて興味があります。

Fluent Interfaceアプローチを使用して生のHTMLを作成するのをやめるために、Knockout用の小さなラッパーライブラリを作成しています。ただし、次のようなことができない限り、非常に面倒になります。

@using(Html.KoDiv().ForEach("MyArray").Visible("!Busy"))
{
     <some html here>
}

私が見たのと同じような外観の唯一のものは次のとおりです。

@using(Html.BeginForm("Action"))
{
    <some html here>
}

質問:どうすればこの構文を実行できますか?または、私が考えていなかった他の軽量構文アプローチはありますか?

彼らのアプローチではステートメントを使用する必要があるため、彼らは応答に直接書き込んでいるか、おそらくHtmlHelper.Raw()を呼び出して、Dispose()メソッドに終了タグをレンダリングしていると思いました。usingただし、どちらもこれまで機能していません。何か案は?ありがとう!

サンプルコード:

 public class KoElement : IHtmlString, IDisposable
{
    protected StringBuilder m_sb;
    protected TagBuilder m_tagBuilder;
    protected List<string> m_events;


    public KoElement(TagBuilder tb, HtmlHelper html = null)
    {
        m_tagBuilder = tb;
        m_events = new List<string>();

    }

    public string ToHtmlString()
    {
        m_tagBuilder.Attributes.Add("data-bind", string.Join(", ", m_events));
        return m_tagBuilder.ToString(TagRenderMode.StartTag);
    }

    public void Dispose()
    {
         HttpContext.Current.Response.Write("</" + m_tagBuilder.TagName + ">");
    }

    public KoElement Visible(string expression)
    {
        if (!string.IsNullOrEmpty(expression))  
            m_events.Add(string.Format("visible: {0}", expression));
        return this;
    }

    public KoElement ForEach(string expression)
    {
        if (!string.IsNullOrEmpty(expression))
            m_events.Add(string.Format("foreach: {0}", expression));
        return this;
    }
}
4

1 に答える 1

3

を使用するのではなく、HTMLヘルパーでHttpContext.Current.Response.Write()使用する必要があります。ViewContext.Writer.Write()

public class KoElement : IHtmlString, IDisposable
{
    protected HtmlHelper m_html;
    protected TagBuilder m_tagBuilder;
    protected List<string> m_events;

    public KoElement(TagBuilder tb, HtmlHelper html)
    { 
        m_html = html;
        m_tagBuilder = tb;
        m_events = new List<string>();
    }

    public string ToHtmlString()
    {
        m_tagBuilder.Attributes.Add("data-bind", string.Join(", ", m_events));
        return m_tagBuilder.ToString(TagRenderMode.StartTag);
    }

    public void Dispose()
    {
        m_html.ViewContext.Writer.Write("</" + m_tagBuilder.TagName + ">");
    }
}
于 2012-09-27T02:10:35.737 に答える