5

例如,如果您检查这两个扩展方法,唯一的区别是 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)用于使匿名对象成为字典。

在我看来,视图使用匿名对象更干净。你们觉得怎么样?使用匿名对象有什么缺点吗?

4

3 回答 3

10

There's not too much difference, however using the anonymous object is a cleaner and more readable syntax for the caller, and now considered more standard practice. There might be a slight, negligible performance benefit to using IDictionary if you're a fan of micro-optimisation.

The IDictionary overload option has probably stuck since ASP.NET MVC 1.0 CTP days when C# 3.0 and anonymous objects were still quite new. Eilon Lipton's blog post proposing Using C# 3.0 Anonymous Types as Dictionaries gives some background.

于 2011-11-17T00:06:01.763 回答
2

IDictionary<string, object>一个特殊的原因。如果您想在扩展函数中调整 htmlAttributes 参数,那么这是可能的。我有几个功能扩展Html.TextBox。例如,我有一个名为: 的函数TextBoxOrDisplayForNoDiaCritics。此函数启用文本框或显示禁用的文本框。此外,它还会从文本框中删除 DiaCritics。我使用 Javascript 函数执行此操作。该事件onchange在输入标签上触发。所以在这个函数中,我将带有 javascript 函数名称的 onchange 事件添加到 htmlAttributes 列表中。如果我使用 IDictionary 这很容易,但是当我使用对象时会更难。

因此,当您开始您的项目时,重要的是要认识到您的 Html 助手必须服务于什么目的。就我而言,因为我认识到我的项目的重要性,所以我在项目中的任何地方都使用 IDictionary。

于 2013-09-10T15:29:39.643 回答
2

克里斯回答了所有问题。

我给出了使用 IDictionary 的另外 1 个理由:在 MVC 3.0 之前,当您需要像“data-something”这样的 HTML5 属性时,您不能使用匿名对象:D

干杯

于 2011-11-17T00:15:48.963 回答