例如,如果检查这两个扩展方法,唯一的区别是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)
来使匿名对象成为字典。
在我看来,使用匿名对象的视图更清晰。你们觉得怎么样?使用匿名对象有什么缺点吗?
答案 0 :(得分:10)
没有太多区别,但是使用匿名对象对于调用者来说是一种更清晰,更易读的语法,现在被认为是更标准的做法。如果您是微优化的粉丝,那么使用IDictionary可能会有轻微的,可忽略的性能优势。
自从ASP.NET MVC 1.0 CTP以来,当C#3.0和匿名对象仍然很新时,IDictionary重载选项可能已经停滞不前。 Eilon Lipton提出的Using C# 3.0 Anonymous Types as Dictionaries博客文章给出了一些背景知识。
答案 1 :(得分:2)
克里斯回答了所有事情。
我再给出一个使用IDictionary的原因:在MVC 3.0之前,当你需要像“data-something”这样的HTML5属性时,你不能使用匿名对象:D
干杯
答案 2 :(得分:2)
IDictionary<string, object>
有特殊原因。如果要在扩展函数中调整htmlAttributes参数,则可以进行此操作。我有几个Html.TextBox
函数的扩展。我有一个名为TextBoxOrDisplayForNoDiaCritics
的函数。此功能启用TextBox或显示禁用的文本框。此外,它还从文本框中删除DiaCritics。我使用Javascript函数执行此操作。事件onchange
将触发输入标记。所以在这个函数中,我将带有javascript函数名的onchange事件添加到htmlAttributes列表中。如果我使用IDictionary很容易,但是当我使用一个更难的对象时。
所以当你开始你的项目时,重要的是要认识到你的Html助手必须服务的目的。在我的情况下,因为我认识到项目中的重要性,所以我在项目中的每个地方都使用IDictionary。