我使用一个匿名对象将我的 Html 属性传递给一些助手方法。 如果使用者没有添加 ID 属性,我希望将它添加到我的 helper 方法中。
How can I add an attribute to this anonymous object?
我猜你指的是匿名类型,比如 new { Name1=value1, Name2=value2}等等。如果是这样,那么您就不走运了——匿名类型是正常的类型,因为它们是固定的、已编译的代码。它们只是碰巧是自动生成的。
new { Name1=value1, Name2=value2}
你所做的就是写 new { old.Name1, old.Name2, ID=myId },但我不知道这是否是你真正想要的。关于这种情况的更多细节(包括代码示例)将是理想的。
new { old.Name1, old.Name2, ID=myId }
Alternatively, you could create a container object which 一直都是 had an ID and whatever other object contained the rest of the properties.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
这将接受文本框应该具有的 id 值和标签应该引用的 id 值。 如果使用者现在没有在 textBoxHtmlAttritribute 中包含“ id”属性,那么该方法将创建一个不正确的标签。
我可以通过反射检查这个属性是否添加到 labelHtmlAttritribute 对象中。如果是这样,我想添加它或创建一个新的匿名对象添加了它。 但是因为我不能通过遍历旧的属性并添加我自己的“ id”属性来创建一个新的匿名类型,所以我有点卡住了。
A container with a strongly typed ID property and then an anonymous typed "attributes" property would require code rewrites that don't weigh up to the "add an id field" requirement.
希望这个反应是可以理解的。这是一天的结束,不能让我的大脑在线了. 。
下面的扩展类可以满足您的需要。
public static class ObjectExtensions { public static IDictionary<string, object> AddProperty(this object obj, string name, object value) { var dictionary = obj.ToDictionary(); dictionary.Add(name, value); return dictionary; } // helper public static IDictionary<string, object> ToDictionary(this object obj) { IDictionary<string, object> result = new Dictionary<string, object>(); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); foreach (PropertyDescriptor property in properties){ result.Add(property.Name, property.GetValue(obj)); } return result; } }
如果你想扩展这个方法:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
虽然我确信 Khaja 的 Object 扩展可以工作,但是通过创建一个 RouteValueDictionary 并传入 routeValue 对象,从 Context 中添加额外的参数,然后使用 ActionLink 重载返回一个 RouteValueDictionary 而不是一个对象,可能会获得更好的性能:
这应该会奏效:
public static MvcHtmlString MyLink(this HtmlHelper helper, string linkText, string actionName, object routeValues) { RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues); // Add more parameters foreach (string parameter in helper.ViewContext.RequestContext.HttpContext.Request.QueryString.AllKeys) { routeValueDictionary.Add(parameter, helper.ViewContext.RequestContext.HttpContext.Request.QueryString[parameter]); } return helper.ActionLink(linkText, actionName, routeValueDictionary); }