在ASP.NET MVC中,有很多Helpers接受匿名类型作为参数并生成输入。
例如:
@Html.Action("Action", "Controler", new {routeVal1 = 1, routeVal2 = 2})
我的问题是如何实现我自己的接受匿名类型的扩展。我应该将它作为对象引用并使用反射还是有更优雅的解决方案?
答案 0 :(得分:3)
您可以使用dynamic
代替object
。
Visual C#2010引入了一种新的动态类型。类型是静态类型,但动态类型的对象绕过静态类型检查。在大多数情况下,它的功能类似于它具有类型对象。在编译时,假定键入为动态的元素支持任何操作。因此,您不必担心对象是从COM API,动态语言(如IronPython),HTML文档对象模型(DOM),反射还是程序中的其他位置获取其值。但是,如果代码无效,则会在运行时捕获错误。
答案 1 :(得分:1)
@HTML
对象
你需要做的是用创建方法
RouteValueDictionary类
所以它变成了 public static mvchtmlstring Foo(string Action,string Controller,RouteValueDictionary values)
然后你有函数调用
TagBuilder tb = new TagBuilder("D");
tb.Attributes.Add();
所以整个事情变成
public static mvchtmlstring Foo(string taglabel, string url, RouteValueDictionary values)
{
TagBuilder tb = new TagBuilder("a");
tb.Attrubutes.add("href",url);
tb.setInnerText(taglabel);
tb.MergeAttributes(values);
return new MvcHtmlString(tb.toString());
}
然后电话是
@Html.Foo("Bar","Http://www.stackoverflow.com",new {Id="d", class="dd"})
BTW RouteValueDictionary继承自IDictionary,因此您的类也可以拥有该签名。