2012-02-14 42 views
2

两个目标我已经声明,像这样两个对象:如何合并在C#asp.net MVC3

new {@class = "aClass", bar="bar"} 

new{foo = "foo"} 

我如何将它们结合起来,所以我得到这样的结果?

{@class = "aClass", bar="bar", foo = "foo"} 

(以任意顺序)

我的目标是额外的HTML属性结合在一个自定义的HtmlHelper。

干杯

+1

你能指望什么发生,如果它们包含重复的(意思是两个集合包含相同的属性)? – 2012-02-14 06:25:42

+0

有没有真的想过,因为我不指望它发生。但这是一个很好的观点。我想我必须重写它。 – MrJD 2012-02-14 21:33:06

回答

3
object x = new { @class = "aClass", bar = "bar" }; 
object y = new { foo = "foo" }; 

var htmlAttributes = new RouteValueDictionary(x); 
foreach (var item in new RouteValueDictionary(y)) 
{ 
    htmlAttributes[item.Key] = item.Value; 
} 

// at this stage htmlAttributes represent an IDictionary<string, object> 
// that will contain the 3 values and which could be passed 
// along to the overloaded versions of the standard helpers 
// for example: 
var link = htmlHelper.ActionLink("link text", "foo", null, htmlAttributes); 

// would generate: 
// <a href="/home/foo" class="aClass" bar="bar" foo="foo">link text</a> 
+0

梦幻般的答案!正是我需要的。我可以查询,如果两个对象都包含同名的属性会发生什么? – MrJD 2012-02-14 22:14:33

+1

@MrJD,第二个将占上风,并覆盖第一个。但是,如果这不是你想要的foreach循环内的东西,你可以在覆盖它之前测试一个键是否存在于htmlAttributes字典中。 – 2012-02-14 22:18:00

+0

该功能没问题。我只是不想要抛出任何异常。谢谢! – MrJD 2012-02-14 22:19:47

0

假设两个对象匿名类型

var a = new { @class = "aClass", bar = "bar" }; 
var b = new { foo = "foo" }; 

结合它们是创建具有两者的成员的新对象的唯一方式:

var result = new { [email protected], a.bar, b.foo }; 

Screenshot

+0

这很好,除非我没有第一堂课的定义。所以我不能选择它的属性。 – MrJD 2012-02-14 21:32:15

1

我已经试过凯尔芬利的Merge Two Objects into an Anonymous Type,它工作的很完美。

随着TypeMerger合并很简单,只要

var obj1 = new {foo = "foo"};

var obj2 = new {bar = "bar"};

var mergedObject = TypeMerger.MergeTypes(obj1 , obj2);

就是这样,你得到的合并对象,除此之外,还有一项条款,忽视特定的属性。您也可以为MVC3使用相同的功能。