Я использую анонимный объект для передачи атрибутов Html некоторым вспомогательным методам. Если потребитель не добавил атрибут ID, я хочу добавить его в мой вспомогательный метод.
Как добавить атрибут к анонимному объекту?
Я использую анонимный объект для передачи атрибутов Html некоторым вспомогательным методам. Если потребитель не добавил атрибут ID, я хочу добавить его в мой вспомогательный метод.
Как добавить атрибут к анонимному объекту?
Если вы пытаетесь расширить этот метод:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Хотя я уверен, что расширения Khaja Object будут работать, вы можете получить лучшую производительность, создав RouteValueDictionary и передав объект routeValues, добавьте дополнительные параметры из контекста, а затем вернитесь с помощью перегрузки 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);
    }
		Следующий класс расширений даст вам то, что вам нужно.
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 }, но я не знаю, действительно ли это то, что вы хотите. Более подробная информация о ситуации (включая образцы кода) была бы идеальной.
В качестве альтернативы вы можете создать объект контейнера, который всегда имел идентификатор и любой другой объект, содержащий остальные свойства.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
Это будет принимать значение id, которое должно иметь текстовое поле, и метка должна ссылаться. Если потребитель теперь не включает свойство "id" в textBoxHtmlAttributes, метод создаст неправильную метку.
Я могу проверить отражение, если этот атрибут добавлен в объект labelHtmlAttributes. Если это так, я хочу добавить его или создать новый анонимный объект, который он добавил. Но поскольку я не могу создать новый анонимный тип, прогуливаясь по старым атрибутам и добавляя свой собственный атрибут "id", я как бы застрял.
Контейнер с сильно типизированным свойством идентификатора, а затем анонимным типизированным атрибутом "атрибуты" потребует перезаписи кода, которые не имеют значения "добавить поле идентификатора".
Надеюсь, что этот ответ понятен. Это конец дня, больше не может получить мои мозги.