Я використовую анонімний об'єкт, щоб передати свої атрибути Html деяким допоміжним методам. Якщо споживач не додав атрибут ідентифікатора, я хочу додати його у своєму допоміжному методі.
Як я можу додати атрибут до цього анонімного об’єкта?
Я використовую анонімний об'єкт, щоб передати свої атрибути Html деяким допоміжним методам. Якщо споживач не додав атрибут ідентифікатора, я хочу додати його у своєму допоміжному методі.
Як я можу додати атрибут до цього анонімного об’єкта?
Відповіді:
Якщо ви намагаєтесь розширити цей метод:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Хоча я впевнений, що розширення об'єкта Khaja спрацює, ви можете отримати кращу ефективність, створивши 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", я щось застряг.
Контейнер із сильно набраним властивістю ідентифікатора, а потім анонімним набраним властивістю "атрибутів" потребує перезапису коду, який не важить до вимоги "додати поле ідентифікатора".
Сподіваюся, що ця відповідь зрозуміла. Кінець дня, більше не можу змусити мізки.