Utilizo un objeto anónimo para pasar mis atributos Html a algunos métodos auxiliares. Si el consumidor no agregó un atributo de ID, quiero agregarlo en mi método auxiliar.
¿Cómo puedo agregar un atributo a este objeto anónimo?
Utilizo un objeto anónimo para pasar mis atributos Html a algunos métodos auxiliares. Si el consumidor no agregó un atributo de ID, quiero agregarlo en mi método auxiliar.
¿Cómo puedo agregar un atributo a este objeto anónimo?
Respuestas:
Si está intentando extender este método:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Aunque estoy seguro de que las extensiones de objeto de Khaja funcionarían, es posible que obtenga un mejor rendimiento creando un RouteValueDictionary y pasando el objeto routeValues, agregue sus parámetros adicionales del Context, luego regrese usando la sobrecarga ActionLink que toma RouteValueDictionary en lugar de un objeto:
Esto debería funcionar:
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 siguiente clase de extensión le proporcionará lo que necesita.
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;
}
}
Supongo que te refieres a tipos anónimos aquí, por ejemplo, new { Name1=value1, Name2=value2}
etc. Si es así, no tienes suerte: los tipos anónimos son tipos normales en el sentido de que son código compilado y fijo. Simplemente resultan ser autogenerados.
Lo que podrías hacer es escribir, new { old.Name1, old.Name2, ID=myId }
pero no sé si eso es realmente lo que quieres. Algunos detalles más sobre la situación (incluidos ejemplos de código) serían ideales.
Alternativamente, puede crear un objeto contenedor que siempre tenga un ID y cualquier otro objeto que contenga el resto de las propiedades.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
Esto aceptaría el valor de identificación que debería tener el cuadro de texto y al que debería hacer referencia la etiqueta. Si el consumidor ahora no incluye la propiedad "id" en el textBoxHtmlAttributes, el método creará una etiqueta incorrecta.
Puedo verificar mediante la reflexión si este atributo se agrega en el objeto labelHtmlAttributes. Si es así, quiero agregarlo o crear un nuevo objeto anónimo que lo tenga agregado. Pero como no puedo crear un nuevo tipo anónimo recorriendo los atributos antiguos y agregando mi propio atributo "id", estoy un poco atascado.
Un contenedor con una propiedad de ID fuertemente tipada y luego una propiedad de "atributos" tipeada anónima requeriría reescrituras de código que no pesen para el requisito de "agregar un campo de identificación".
Espero que esta respuesta sea comprensible. Es el final del día, ya no puedo poner mi cerebro en línea ...