C# 匿名类和IDictionary之间的区别<;字符串,对象>;对于ASP.NET MVC中的HTML属性?

C# 匿名类和IDictionary之间的区别<;字符串,对象>;对于ASP.NET MVC中的HTML属性?,c#,asp.net-mvc,asp.net-mvc-3,idictionary,C#,Asp.net Mvc,Asp.net Mvc 3,Idictionary,例如,如果您检查这两种扩展方法,唯一的区别是htmlAttributes的类型,因此您可以通过两种不同的方式传递htmlAttributes: public static MvcHtmlString TextBoxFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression,

例如,如果您检查这两种扩展方法,唯一的区别是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);
公共静态MvcHtmlString TextBoxFor( 这个HtmlHelper HtmlHelper, 表情表情, i词典(贡品); 公共静态MvcHtmlString TextBoxFor( 这个HtmlHelper HtmlHelper, 表情表情, 对象(属性); 并以以下任一方式使用它们:

@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." } })
@Html.TextBoxFor(model=>model.TagLine,
新的{@placeholder=“我们活着就是为了创造艺术。”)
@Html.TextBoxFor(model=>model.TagLine,
新字典{
{“占位符”,“我们活着就是为了创造艺术。”})
我已经检查了MVC源代码,我知道在后台他们使用相同的方法,但是接受匿名对象的人使用
HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
使匿名对象成为字典


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

没有太大区别,但是使用匿名对象对调用方来说是一种更干净、更可读的语法,现在被认为是更标准的做法。如果您是微优化的粉丝,那么使用IDictionary可能会有一点微不足道的性能优势


IDictionary重载选项可能从ASP.NET MVC 1.0 CTP时代起就一直存在,当时C#3.0和匿名对象还很新。艾伦·利普顿的博客文章提供了一些背景信息。

克里斯回答了所有问题

我给出了使用IDictionary的另外一个原因:在MVC3.0之前,当您需要HTML5属性(如“data something”):D时,您不能使用匿名对象

干杯

我的词典有一个特殊的原因。如果您想在扩展函数中调整htmlAttributes参数,那么这是可能的。我有几个
Html.TextBox
函数的扩展。例如,我有一个函数名为:
TextBoxOrDisplayForNoDiaCritics
。此功能启用文本框或显示禁用的文本框。此外,它还从文本框中删除变音符号。我使用Javascript函数来实现这一点。事件
onchange
在输入标记上激发。因此,在这个函数中,我将带有javascript函数名的onchange事件添加到htmlAttributes列表中。如果我使用IDictionary,那很容易,但当我使用object时,那就难多了


因此,当你开始你的项目时,认识到你的Html助手的作用是很重要的。在我的例子中,因为我认识到在我的项目中的重要性,所以在我的项目中到处都使用IDictionary。

你可以使用下划线,比如:@Html.TextBoxFor(model=>model.TagLine,new{data\u as_multiple=“true”})从MVC 3.0开始,你可以使用下划线,例如
new{data\u something=“value”}
,它将自动转换为破折号
data something=“value”
字典重载在某些情况下非常有用,因为您已经有了字典。这正是我要做的。是否从视图中传入dictionary对象(语法不如传入匿名对象干净)?或者,如果传入匿名对象,如何将其转换为字典,以便添加其他属性?当然,这在反射中是可能的,但这似乎是一个非常常见的场景,我想他们会在MVC中构建一个帮助器方法来进行转换,但我还没有发现它这么远。这就是我通过的方式,看起来不那么干净,但可以工作:@Html.TextBoxWhenEmptyFor(model=>model.UAccount,new Dictionary{{modelstants.Style,modelstants.WidthMinZoekButton}})另一种方式:@Html.Partial(“_LogoHeading”,new{Logo=“applicates”,Link=“applicates”}.ToExpando()),因为我想传递属性,而这是不可能动态传递的。