我使用匿名对象将我的 Html 属性传递给一些辅助方法。如果消费者没有添加 ID 属性,我想在我的辅助方法中添加它。
如何向此匿名对象添加属性?
我使用匿名对象将我的 Html 属性传递给一些辅助方法。如果消费者没有添加 ID 属性,我想在我的辅助方法中添加它。
如何向此匿名对象添加属性?
以下扩展类将为您提供所需的东西。
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;
}
}
我假设您在这里指的是匿名类型,例如new { Name1=value1, Name2=value2}
等。如果是这样,那么您就不走运了-匿名类型是普通类型,因为它们是固定的编译代码。它们恰好是自动生成的。
你能做的就是写new { old.Name1, old.Name2, ID=myId }
,但我不知道这是否真的是你想要的。有关情况的更多详细信息(包括代码示例)将是理想的。
或者,您可以创建一个始终具有 ID 的容器对象,以及包含其余属性的任何其他对象。
如果您尝试扩展此方法:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
虽然我确信 Khaja 的对象扩展会起作用,但您可能会通过创建 RouteValueDictionary 并传入 routeValues 对象、从 Context 添加其他参数,然后使用采用 RouteValueDictionary 而不是对象的 ActionLink 重载返回来获得更好的性能:
这应该可以解决问题:
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);
}
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
这将接受文本框应具有的 id 值和标签应引用的值。如果消费者现在没有在 textBoxHtmlAttributes 中包含“id”属性,则该方法将创建一个不正确的标签。
如果这个属性被添加到 labelHtmlAttributes 对象中,我可以通过反射检查。如果是这样,我想添加它或创建一个新的匿名对象来添加它。但是因为我无法通过遍历旧属性并添加自己的“id”属性来创建新的匿名类型,所以我有点卡住了。
具有强类型 ID 属性和匿名类型“属性”属性的容器将需要不符合“添加 id 字段”要求的代码重写。
希望这个回答是可以理解的。这一天结束了,我不能再让我的大脑排成一行了。。