4

私はこのようなヘルパーを持っています。次のように内部で生の HTML を使用してこれを作成しました。

private static readonly Core Db = new Core();
        // Main menu
public static MvcHtmlString MainMenu()
{
    IQueryable<Page> primaryPages = Db.Pages.Where(p => p.IsItShowInMenu);
    var sb = new StringBuilder();
    sb.Clear();
     string pagecode = Convert.ToString(HttpContext.Current.Request.RequestContext.RouteData.Values["url"]);
    sb.Append("<div id=\"Logo\">");
    sb.Append("<a href=\"/\"><span id=\"Logo_Text\">Dr. Shreekumar</span></a> <span id=\"Logo_Sub_Text\">Obstetrician & Gynecologist</span>");
    sb.Append("</div>");
    sb.Append("<div id=\"Primary_Menu\">");
    sb.Append("<ul>");
    foreach (Page page in primaryPages)
    {
        if (page.PageCode != "Home")
        {
             Page currentPage = Db.Pages.SingleOrDefault(p => p.PageCode == pagecode);
             if (currentPage != null)
             {
                  Page parentPage = Db.Pages.Find(currentPage.ParentId);
                  if (parentPage != null)
                  {
                      sb.AppendFormat((page.PageCode == parentPage.PageCode ||
                      page.PageCode == currentPage.PageCode)
                      ? "<li class=\"active\"><a href=\"/pages/{0}\">{1}</a></li>"
                        : "<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode,
                              page.Name.Trim());

                  }
                  else
                  {
                     sb.AppendFormat("<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode,page.Name);
                  }
              }
              else
              {
                  sb.AppendFormat("<li><a href=\"/pages/{0}\">{1}</a></li>", page.PageCode, page.Name);
              }
        }
    }
    sb.Append("</ul>");
    sb.Append("</div>");
    return new MvcHtmlString(sb.ToString());
 }

MVC HTML ヘルパー (アンカー、リスト (li)、div などのヘルパー) を使用してこれを変換する方法を教えてください。

4

2 に答える 2

3

ヘルパーによって生成されるものと生成されないものを定義することは、アプリケーションのアーキテクトとしての役割の重要な部分です。これは、コード内のどこで、どのくらいの頻度で何が繰り返されるかに依存するためです。アプリケーション全体のアーキテクチャに依存するため、何のためにヘルパーを作成するかについては説明しません。ただし、決定を下すために、作成できる 2 つの一般的なタイプのヘルパー (グローバルとローカル) を検討してください。

グローバル ヘルパーは、サイト全体で頻繁に繰り返されるコードのチャンク用であり、さまざまなパラメーターを渡すことで処理できるいくつかの小さな変更が含まれている可能性があります。ローカル ヘルパーは同じ仕事をしますが、特定のページに対してローカルです。他のどこにも見られないコードの繰り返しセグメントを含むページは、ローカル ヘルパーを実装する必要があります。さて...

グローバル ヘルパー: ヘルパーを含める新しい静的クラスを作成します。次に、コンテナ クラス内に次のような静的メソッドを作成します。

public static MvcHtmlString MyHelper(this HtmlHelper helper, (the rest of your arguments here))
{
    // Create your HTML string.
    return MvcHtmlString.Create(your string);
}

Html.これにより、Html ヘルパー クラスに拡張メソッドが作成され、標準構文でヘルパーにアクセスできるようになります。カスタム ヘルパーを使用するすべてのファイルに、このクラスの名前空間を含める必要があることに注意してください。

ローカル ヘルパー: ヘルパーを実行するもう 1 つの方法は、ヘルパーを単一のビューに対してローカルにしたい場合に機能します。おそらく、何度も何度も繰り返されているビューにコードのブロックがあるでしょう。次の構文を使用できます。

@helper MyHelper()
{
    // Create a string
    @MvcHtmlString.Create(your string here);
}

次に、次を使用してこれをページに出力できます。

@MyHelper()

常にMvcHtmlStringオブジェクトを作成する理由は、MVC に組み込まれているセキュリティ機能として、出力された文字列がエンコードされてページ上のテキストに表示されるためです。これは<、ページ上で実際に「<」が表示されるように、a がエンコードされることを意味します。デフォルトでは、HTML タグを開始しません。

これを回避するには、MvcHtmlStringこのセキュリティ機能をバイパスし、HTML をページに直接出力できるクラスを使用します。

于 2012-12-09T08:15:10.787 に答える
1

レンダリングされているSectionのは であるため、このすべてのロジックを別のロジックに移動することをお勧めします。Menu

コードから HTML を構築する代わりに、 の を使用して構築する方がクリーンで便利Razorですhelperセクションをレンダリングする方法については、これと Scott Gu のこの記事を参照して、クイック スタート ガイドを入手してください。

次のようなヘルパー メソッドの使用を検討してください。

@Html.DropDownListFor() また
@Html.DropDownList()

于 2012-12-10T07:18:08.100 に答える