J'utilise un objet anonyme pour transmettre mes attributs HTML à certaines méthodes d'assistance. Si le consommateur n'a pas ajouté d'attribut ID, je veux l'ajouter dans ma méthode d'assistance.
Comment puis-je ajouter un attribut à cet objet anonyme?
Si vous essayez d'étendre cette méthode:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Bien que je sois sûr que les extensions d'objet de Khaja fonctionneraient, vous pourriez obtenir de meilleures performances en créant un RouteValueDictionary et en transmettant l'objet routeValues, ajoutez vos paramètres supplémentaires à partir du contexte, puis revenez en utilisant la surcharge ActionLink qui prend un RouteValueDictionary au lieu d'un objet:
Cela devrait faire l'affaire:
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);
}
La classe d'extension suivante vous fournira ce dont vous avez besoin.
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;
}
}
Je suppose que vous parlez ici de types anonymes, par exemple new { Name1=value1, Name2=value2}
etc. Si c'est le cas, vous n'avez pas de chance - les types anonymes sont des types normaux dans la mesure où ils sont du code fixe et compilé. Il se trouve qu'ils sont autogénérés.
Ce que vous pourriez faire, c'est écrire new { old.Name1, old.Name2, ID=myId }
mais je ne sais pas si c'est vraiment ce que tu veux. Quelques détails supplémentaires sur la situation (y compris des exemples de code) seraient idéaux.
Alternativement, vous pouvez créer un objet conteneur qui toujours avait un ID et tout autre objet contenant le reste des propriétés.