Эффективнее передать коллекцию в MVC.NET HtmlHelpers? Предложения? - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть вспомогательный метод Html со следующей подписью:

public static string MyActionLink(this HtmlHelper html
, string linkText
, List<KeyValuePair<string, object>> attributePairs
, bool adminLink){}

У меня есть другая утилита, которая берет все пары атрибутов и объединяет их в тег как пары атрибут / значение:

ExtensionsUtilities.MergeAttributesToTag(tag, attributePairs);

и все в порядке. Проблема, однако, заключается в том, что параметр

, List<KeyValuePair<string, object>> attributePairs

немного громоздко в определении, а тем более при использовании метода Хелпера:

<span class="MySpan">  
    <%= Html.MyActionLink(Html.Encode(item.Name)
        , new List<KeyValuePair<string, object>>
               {
                   Html.GetAttributePair("href", Url.Action("ACTION","CONTROLLER")),
                   Html.GetAttributePair("Id", Html.Encode(item.Id)),
                   Html.GetAttributePair("customAttribute1", Html.Encode(item.Val1)),
                   Html.GetAttributePair("customAttribute2", Html.Encode(item.Val2))
               }, false)%>
</span>

(Html.GetAttributePair() просто возвращает KeyValuePair в попытке немного привести в порядок вещи)

Мне просто любопытно, может ли кто-нибудь предложить другой (возможно, более эффективный и удобный для разработчиков) подход к достижению того же результата?

Спасибо, ребята

Dave

1 Ответ

1 голос
/ 10 февраля 2010

Как насчет использования анонимного типа:

public static string MyActionLink(
    this HtmlHelper html, 
    string linkText, 
    object attributePairs, 
    bool adminLink)
{}

Что можно назвать так:

<%= Html.MyActionLink(
    Html.Encode(item.Name), 
    new { 
        href = Url.Action("ACTION","CONTROLLER"),
        id = tml.Encode(item.Id),
        customAttribute1 = Html.Encode(item.Val1),
        customAttribute2 = Html.Encode(item.Val2)
    },
    false) %>

UPDATE:

А вот как преобразовать анонимный тип в строго типизированный словарь:

var values = new 
{ 
    href = "abc",
    id = "123"
};

var dic = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
if (values != null)
{
    foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values))
    {
        object value = descriptor.GetValue(values);
        dic.Add(descriptor.Name, value);
    }
}
...