Разница между анонимным классом и IDictionary‹string,object› для htmlAttributes в ASP.NET MVC?

Например, если вы проверяете эти два метода расширения, единственная разница заключается в типе htmlAttributes, поэтому вы можете передавать свои htmlAttributes двумя разными способами:

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    IDictionary<string, object> htmlAttributes);

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    object htmlAttributes);

И используйте их одним из следующих способов:

@Html.TextBoxFor(model => model.TagLine,
    new { @placeholder = "We live to make art." })

@Html.TextBoxFor(model => model.TagLine,
    new Dictionary<string, object> { 
        { "placeholder", "We live to make art." } })

Я проверил исходный код MVC и знаю, что в фоновом режиме они используют один и тот же метод, но тот, который принимает анонимный объект, использует HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), чтобы сделать анонимный объект словарем.

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


person Azadeh Khojandi    schedule 16.11.2011    source источник


Ответы (3)


Между тем особой разницы нет, однако использование анонимного объекта является более чистым и удобочитаемым синтаксисом для вызывающей стороны и теперь считается более стандартной практикой. Использование IDictionary может дать небольшое, незначительное преимущество в производительности, если вы являетесь поклонником микрооптимизации.

Параметр перегрузки IDictionary, вероятно, застрял со времен ASP.NET MVC 1.0 CTP, когда C# 3.0 и анонимные объекты были еще совсем новыми. Сообщение в блоге Эйлона Липтона, предлагающее использование C# 3.0 Anonymous Types as Dictionary дает некоторую информацию.

person Chris Fulstow    schedule 17.11.2011
comment
Перегрузки словаря полезны в некоторых случаях, когда у вас уже есть словарь. - person Haacked; 21.11.2011

IDictionary<string, object> здесь по особой причине. Если вы хотите настроить параметр htmlAttributes в расширенной функции, это возможно. У меня есть несколько расширений функции Html.TextBox. У меня есть, например, функция, которая называется: TextBoxOrDisplayForNoDiaCritics. Эта функция включает текстовое поле или отображает отключенное текстовое поле. Кроме того, он также удаляет DiaCritics из текстового поля. Я делаю это с помощью функции Javascript. Событие onchange срабатывает во входном теге. Итак, в этой функции я добавляю это событие onchange с именем функции javascript в список htmlAttributes. Если я использую IDictionary, это легко, но когда я использую объект, это будет намного сложнее.

Поэтому, когда вы начинаете свой проект, важно понять, для какой цели должны служить ваши Html-помощники. В моем случае, поскольку я осознаю важность своего проекта, я использую IDictionary везде в своем проекте.

person Herman Van Der Blom    schedule 10.09.2013
comment
Это именно то, что я пытаюсь сделать. Вы передаете объект словаря из своих представлений (синтаксис не такой чистый, как передача анонимного объекта)? Или, если вы передаете анонимный объект, как вы преобразуете его в словарь, чтобы вы могли добавить дополнительные атрибуты? Конечно, это возможно с отражением, но это кажется достаточно распространенным сценарием, и я думаю, что они создали бы вспомогательный метод в MVC для выполнения этого преобразования, но я пока его не нашел. - person Teevus; 14.03.2014
comment
вот как я передаю, выглядит не так чисто, но работает: @Html.TextBoxWhenEmptyFor(model => model.UAccount, new Dictionary‹string, object› { { ModelConstants.Style, ModelConstants.WidthMinZoekButton } }) другой способ: @Html .Partial(_LogoHeading, new { Logo = Applications, Link = Applications }.ToExpando() ), потому что я хочу передавать свойства, а это то, что в противном случае невозможно динамически. - person Herman Van Der Blom; 18.03.2014

Крис отвечает на все.

Я даю еще одну причину, по которой следует использовать IDictionary: до MVC 3.0 вы не могли использовать анонимный объект, когда вам нужен атрибут HTML5, например «данные-что-то»: D

Ваше здоровье

person Van Thoai Nguyen    schedule 17.11.2011
comment
Вы можете использовать это с подчеркиванием, например: @Html.TextBoxFor(model =› model.TagLine, new { data_as_multiple = true }) - person Azadeh Khojandi; 17.11.2011
comment
Начиная с MVC 3.0, вы можете использовать символ подчеркивания, например. new { data_something = "value" }, который автоматически преобразуется в тире data-something="value" - person Chris Fulstow; 17.11.2011