4

Yahoo の User Interface Libraryを支援する MVC 用のHTMLHelper クラスを作成した人はいますか?

たとえば、「メニュー モデル」をYahoo Menu Controlのサポートに必要な HTML マークアップに変換するヘルパー メソッドを作成しました。ここでは MVC パターンがうまく機能します。なぜなら、別のメニュー実装に切り替えることを選択した場合、モデルに触れずに新しいヘルパーを作成するだけでよいからです。

このコードは私にとっては機能しますが、完全にはテストされていないため、自由に使用してください。

まず、メニュー モデル自体の単純なデータ構造が必要です。通常の MVC 規則を使用して、これをページ モデルに追加します。たとえば、ビューから を介してメニュー項目のリストにアクセスしますViewData.Model.MainMenu.MenuOptions

public class MenuItem

{
    public string Text { get; set; }
    public string Description { get; set; }
    public string RouteURL { get; set; }
    public bool SeparatorBefore { get; set; }

    public List<MenuItem> MenuItems { get; set; }
}

延長方法。ビューにアクセスできる名前空間に入れます。

public static class YUIExtensions
    {
        public static string RenderMenu(this HtmlHelper html, string id, List<MenuItem> menuItems)
        {
            // <div id="mnuTopNav" class="yuimenubar yuimenubarnav">
            //    <div class="bd">
            //        <ul class="first-of-type">

            //            <li class="yuimenubaritem first-of-type"><a class="yuimenubaritemlabel" href="#store">Store</a></li>

            //            <li class="yuimenubaritem"><a class="yuimenubaritemlabel" href="#products">Products</a>

            //                <div id="communication" class="yuimenu">
            //                    <div class="bd">
            //                        <ul>
            //                            <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://360.yahoo.com">360&#176;</a></li>
            //                            <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://mobile.yahoo.com">Mobile</a></li>
            //                            <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://www.flickr.com">Flickr Photo Sharing</a></li>
            //                        </ul>
            //                    </div>
            //                </div>     
            //            </li>

            //        </ul>            
            //    </div>
            //</div>   

            int menuId = 0;
            HtmlGenericControl menuControl = CreateControl(html, id, 0, ref menuId, menuItems);

            // render to string
            StringWriter sw = new StringWriter();
            HtmlTextWriter tw = new HtmlTextWriter(sw);
            tw.Indent = 1;
            menuControl.RenderControl(tw);
            return sw.ToString();
        }

        private static HtmlGenericControl CreateControl(HtmlHelper html, string id, int level, ref int menuId, List<MenuItem> currentItems)
        {
            var menu = new HtmlGenericControl("div");
            menu.Attributes["class"] = (level == 0) ? "yuimenubar yuimenubarnav" : "yuimenu";
            menu.Attributes["id"] = id;

            var div_bd = new HtmlGenericControl("div");
            menu.Controls.Add(div_bd);
            div_bd.Attributes["class"] = "bd";

            HtmlGenericControl ul = null;

            int i = 0;
            foreach (var menuItem in currentItems)
            {
                if (ul == null || menuItem.SeparatorBefore)
                {
                    ul = new HtmlGenericControl("ul");
                    div_bd.Controls.Add(ul);

                    if (i == 0)
                    {
                        ul.Attributes["class"] = "first-of-type";
                    }
                }

                var menuItem_li = new HtmlGenericControl("li");
                menuItem_li.Attributes["class"] = (level == 0) ? "yuimenubaritem" : "yuimenuitem";
                if (i == 0)
                {
                    menuItem_li.Attributes["class"] += " first-of-type";
                }
                ul.Controls.Add(menuItem_li);

                var href = new HtmlGenericControl("a");
                href.Attributes["class"] = (level == 0) ? "yuimenubaritemlabel" : "yuimenuitemlabel";
                href.Attributes["href"] = menuItem.RouteURL;
                href.InnerHtml = menuItem.Text;
                menuItem_li.Controls.Add(href);

                if (menuItem.MenuItems != null && menuItem.MenuItems.Count > 0)
                {
                    menuItem_li.Controls.Add(CreateControl(html, id + "_" + (menuId++), level + 1, ref menuId, menuItem.MenuItems));
                }
                i++;
            }

            return menu;
        }
    }

ビューでメニューを生成したい場所にこのコードを貼り付けます(マスターページにこれがあります):

<%= Html.RenderMenu("mnuTopNav", ViewData.Model.MainMenu.MenuOptions) %>

あなたが怠け者だったり、YUI について知らない場合は、これも必要になるでしょう。<HEAD>

<!-- Combo-handled YUI CSS files: -->
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/combo?2.6.0/build/menu/assets/skins/sam/menu.css">
<!-- Combo-handled YUI JS files: -->
<script type="text/javascript" src="http://yui.yahooapis.com/combo?2.6.0/build/yahoo-dom-event/yahoo-dom-event.js&2.6.0/build/container/container_core-min.js&2.6.0/build/menu/menu-min.js"></script>

これは現在、トップ ナビゲーション スタイルのナビゲーション バーのマークアップを生成しますが、簡単に変更できます。

私は他の誰かが他のコントロールのいくつかについて同じことをしていることを望んでいました.

オープン ソース プロジェクトの有力候補のようですが、それを開始する時間がありません。

実装アドバイス大歓迎!

4

2 に答える 2

3

昨夜、私はこれについて考えましたが、YUIまたはその他のJavascript/HTMLウィジェットを使用して汎用HTMLHelperを作成する機会がさらにあるかどうか疑問に思っています。

たとえば、MenuItemのクラスのように、IMenu用のインターフェイスとITextBox、ICheckBox、IRichTextEditor、ICarouselなどのインターフェイスがある場合、これらの各インターフェイスのYUI実装を作成できます。1つはJQuery用、もう1つはMooToolsまたはストレートHTML/CSS用のもの。

これを引き起こしたものの一部は、次のような記事の一般化です:http ://designingwebinterfaces.com/essential_controlsは、リッチWebアプリのWeb上のUIコントロールを採用しています。

これらのインターフェースには、ID、名前、値、リスト、スタイル、OnChange、OnClickなどの基本的なものと、ValidationRegex、HelpTextなどのあまり目立たないものがすべて含まれます。

これにより、モデルオブジェクトまたはモデルプロパティをITextBoxに変換するレイヤーが作成され、インターフェイスの実装のどれが実際にそれを処理するかを気にする必要がなくなります。また、より優れた/より高速な/より低温の新しい実装に簡単に切り替えることもできます。

ベアボーンHTML実装にValidationRegexのようなものを与えるとどうなるかを処理する必要があり、それを処理する方法はありませんが、検討する価値のあるパスだと思います。また、これを継承するか、単に再実装することで、既存のHTMLHelper名前空間とは別に実装する方が理にかなっていると思いますが、解決策を考え出すこの種の初期のアイデア段階では間違っていることがよくあります。

YUIAsp.NETは興味深いものですが、ASP.NET MVCや、最近のFubu MVCの方向性よりも、WebFormsとユーザーコントロールを重視しています。

私はこのアイデアを少しいじくり回し、その可能性に本当に興味を持っています。

于 2009-02-05T17:57:34.020 に答える
2

サイモン、

これが MVC の質問に関して役立つかどうかはわかりませんが、.NET 内での YUI の操作を簡素化することを目的とした優れたオープンソース プロジェクトがあります。

http://www.yuiasp.net/

メニューは、それらに含まれるコントロールの 1 つです。

少なくとも、あなたの作品が既存のものに新しい次元を追加する場合、これはあなたが貢献できるプロジェクトになる可能性があります.

-エリック

于 2009-01-26T06:23:48.147 に答える