7

ポップアップ ウィンドウに詳細を表示する HTML 形式にレンダリングする必要があるドメイン エンティティが多数あります。

私はこのようなことをしてうれしいです:

Product product = new Product(...);
product.ToHtml();  // or: HtmlRenderer.Render(Product);

しかし、私の主な問題は、後ろからこれを行う方法です。私は3つの異なる答えを持っています:

1. コードでレンダリング:

ToHtml メソッド (C#) 内で Html をレンダリングするためのコードを簡単に記述できます。問題は、静的すぎることです。ヘッダーを中央に少し移動したい場合は、コードを変更する必要があります。さらに、C# で Html のインデントを読み取るのは非常に困難です。

2. XSL の使用:

XSL ファイルは Html テンプレートを簡単に管理でき、XSLT を使用して XML ファイルをドキュメントの適切な場所に変換できます。他の誰かによって既に書かれたパーサー (構文を学ぶ必要があるだけです) ** このためには、各オブジェクトが Xml にシリアル化できる必要があります。オブジェクトが変更された場合 -> Xml が変更されます --> xslt も変更する必要があります ** これにより、HTML を簡単にインデントするオプションも提供されます。たとえば、CSS 機能を追加したり、HTML デザインを変更したりします

3. 他のテンプレート エンジンを使用する場合:

独自の C# -> Html テンプレート エンジンを記述して、ファイル (*.template) からテンプレートを読み取り、リフレクションを使用してテンプレートの適切な場所に適切なプロパティを挿入します。** このソリューションには、考えられる多くの問題があります。たとえば、構文はどのようにすべきか? このことは大丈夫ですか? %Name% %Description% と、配列をどのように扱うことができますか? ** 既存のエンジン (Brail または T4-Templating) を使用できますか?

あなたは何を好むか?あなたは良いエンジンを知っていますか?今のところ、私は 2 番目のソリューションを好みますが、非常に遅くなります。

ありがとう

4

7 に答える 7

5

私はかつて、任意のタイプのコレクションを Html テーブルにレンダリングする必要がありました。css などのオーバーロードを持つ IEnumerable<T> で拡張メソッドを作成しました。それについての私のブログ記事はこちらで見ることができます:

http://crazorsharp.blogspot.com/2009/03/cool-ienumberable-extension-method_25.html

リフレクションを使用してオブジェクトのすべてのプロパティを取得し、素敵な小さなテーブルをレンダリングします。それがあなたのために働くかどうか見てください。

[System.Runtime.CompilerServices.Extension()]
public string ToHtmlTable<T>(IEnumerable<T> list, string propertiesToIncludeAsColumns = "")
{
    return ToHtmlTable(list, string.Empty, string.Empty, string.Empty, string.Empty, propertiesToIncludeAsColumns);
}

[System.Runtime.CompilerServices.Extension()]
public string ToHtmlTable<T>(IEnumerable<T> list, string tableSyle, string headerStyle, string rowStyle, string alternateRowStyle, string propertiesToIncludeAsColumns = "")
{
    dynamic result = new StringBuilder();
    if (String.IsNullOrEmpty(tableSyle)) {
        result.Append("<table id=\"" + typeof(T).Name + "Table\">");
    } else {
        result.Append((Convert.ToString("<table id=\"" + typeof(T).Name + "Table\" class=\"") + tableSyle) + "\">");
    }

    dynamic propertyArray = typeof(T).GetProperties();

    foreach (object prop in propertyArray) {
       if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) {
        if (String.IsNullOrEmpty(headerStyle)) {
            result.AppendFormat("<th>{0}</th>", prop.Name);
        } else {
            result.AppendFormat("<th class=\"{0}\">{1}</th>", headerStyle, prop.Name);
        }
      }
    }

    for (int i = 0; i <= list.Count() - 1; i++) {
        if (!String.IsNullOrEmpty(rowStyle) && !String.IsNullOrEmpty(alternateRowStyle)) {
            result.AppendFormat("<tr class=\"{0}\">", i % 2 == 0 ? rowStyle : alternateRowStyle);

        } else {
            result.AppendFormat("<tr>");
        }
        foreach (object prop in propertyArray) {
            if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) {
                object value = prop.GetValue(list.ElementAt(i), null);
                result.AppendFormat("<td>{0}</td>", value ?? String.Empty);
            }
        }
        result.AppendLine("</tr>");
    }

    result.Append("</table>");

    return result.ToString();
}
于 2009-05-25T22:21:28.223 に答える
3

これは、コントローラーやモデルではなく、ビューの仕事です。ご想像のとおり、方法 (1) を使用すると、変更が非常に脆弱になります。代わりに、特定のドメイン エンティティをレンダリングする方法ごとにビュー フラグメントを記述します。次に、適切なビューを取り込んで、最終ページを作成します。

于 2009-05-25T22:02:56.810 に答える
2

私は方法 A を心から好みます。HTML はすでに標準になっているため、XML (XSL 経由 - 方法 2) やカスタム形式 (方法 3) などの中間形式であまり苦労しないでください。

ただし、ASP.NET MVC で/用に作成する場合は、タイプのオブジェクトを受け入れて適切な HTML をレンダリングする .ASCX (ユーザー コントロール) を作成できます。また、厄介な C# のインデントも、強調表示もオートコンプリートもありません。

1 つのオブジェクト タイプのさまざまなシナリオに対応するために、複数のユーザー ビューを作成することもできます。

于 2009-05-25T22:03:50.833 に答える
1

少し調査した後、任意のオブジェクトを HtmlString に変換する独自の関数を作成しました。

VB .Net コード:

 Public Function ToHtmlString(ByVal fObj As Object) As String
    Dim pType = fObj.GetType()
    Dim props As IList(Of PropertyInfo) = pType.GetProperties()
    Dim value As Object = Nothing
    Dim htmlString As String = "<html><body><form>"

    For Each p In props
        value = p.GetValue(fObj, Nothing)
        If value <> Nothing Then
            htmlString += String.Format("<input type=""hidden"" name=""{0}"" id=""{0}"" value=""{1}""/>", p.Name, value)
        End If
    Next

    htmlString += "</form></body></html>"
    Return htmlString.ToString()

特定のオブジェクトからプロパティ名と値を取得します。あなたはあなたに基づいてhtmlを操作することができます

于 2014-03-03T02:20:16.557 に答える
1

ドメインエンティティオブジェクトを引数として取るカスタムコントロール .ascx ファイルを作成したくない理由はありますか?その後、任意の方法で gui を作成できます。このようにして、コントロールをページに動的に追加し、プロパティを設定してそれらを設定するだけです。

編集 1: コントロールをページに配置する代わりに、HTMLTextWriter にレンダリングするだけです。

        StringBuilder outString = new StringBuilder();
        StringWriter outWriter = new StringWriter(outString);
        HtmlTextWriter htmlText = new HtmlTextWriter(outWriter);
        System.Web.UI.WebControls.Label lbl1 = new System.Web.UI.WebControls.Label();
        lbl1.Text = "This is just a test!";
        lbl1.ToolTip = "Really";
        lbl1.RenderControl(htmlText);
        ViewData["Output"] = outString.ToString();

出力

<span title="Really">This is just a test!</span>

もちろん、組み込みコントロールの代わりにカスタム コントロールを使用しますが、これはすばやく簡単なデモでした。

于 2009-05-25T22:06:41.170 に答える