HTML помощник берет словарькак использовать этот параметр? - PullRequest
15 голосов
/ 15 июля 2010

Если html-помощник принимает в качестве параметра идиктиварий, как его использовать?

Я пытался:

<%= Html.Blah( new { id = "blah" }) %>

Но это не работает.

Ответы [ 4 ]

26 голосов
/ 15 июля 2010
<%= Html.Blah( new Dictionary<string, object>(){
                                                   { "key", "value" },
                                                   { "key1", someObj },
                                                   { "blah", 1 }
                                               } );
6 голосов
/ 17 июля 2014

На всякий случай, если другие тоже столкнутся с этим вопросом. Существует вспомогательный метод, который преобразует анонимный объект в словарь.

Например:

HtmlHelper.AnonymousObjectToHtmlAttributes( new { ng_model = "vm" } );

Другими словами, вы можете создать свой вспомогательный метод HTML согласно вопросу OP, чтобы взять объект и использовать этот вспомогательный метод внутри. Э.Г.

public static string Blah(this HtmlHelper html, object htmlAttributes)
{
    // Create a dictionary from the object
    HtmlHelper.AnonymousObjectToHtmlAttributes( htmlAttributes );

    // ... rest of implementation
}
4 голосов
/ 15 июля 2010

Встроенные методы расширения HtmlHelper обычно предоставляют перегрузки, которые принимают параметр object вместо IDictionary<string, object>, чтобы позволить вам вызывать их, используя анонимный тип, как вы пытались.

Если этосвой собственный метод, вы можете создать другой метод расширения, который будет выглядеть примерно так:

    public static string Blah(this HtmlHelper html, object htmlAttributes)
    {
        return html.Blah(new RouteValueDictionary(htmlAttributes));
    }

Конструктор RouteValueDictionary принимает объект и заполняет себя, используя открытые свойства переданного объекта. Я считаю, что это обычновстроенные методы расширения HtmlHelper делают то же самое.

Кроме того, вы можете вызвать метод следующим образом:

        html.Blah(new RouteValueDictionary(new { id = "blah" }));

Я не смотрел, но кажется очевидным, что класс RouteValueDictionaryделает некоторые отражения, чтобы иметь возможность идентифицировать свойства объекта.Просто знайте, если это то, что вас беспокоит.

1 голос
/ 15 июля 2010

Если вы не хотите использовать общий словарь, Hashtable также реализует IDictionary.

 Html.Blah(new Hashtable(){
                        {"id", "blah"}
                    });
...