Разница между анонимным классом и IDictionaryдля htmlAttributes в ASP.NET MVC? - PullRequest
5 голосов
/ 17 ноября 2011

Например, если вы проверите эти два метода расширения, единственным отличием будет тип 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), чтобы сделать анонимный объект словарем.

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

Ответы [ 3 ]

10 голосов
/ 17 ноября 2011

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

Параметр перегрузки IDictionary вероятно застрял со времен ASP.NET MVC 1.0 CTP, когда C # 3.0 и анонимные объектыбыли еще совсем новыми.В блоге Эйлона Липтона предлагается Использование C # 3.0 анонимных типов в качестве словарей дает некоторую предысторию.

2 голосов
/ 10 сентября 2013

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

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

2 голосов
/ 17 ноября 2011

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

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

Приветствия

...