Domanda

Uso un oggetto anonimo per passare i miei attributi HTML ad alcuni metodi di supporto. Se il consumatore non ha aggiunto un attributo ID, voglio aggiungerlo nel mio metodo di supporto.

Come posso aggiungere un attributo a questo oggetto anonimo?

È stato utile?

Soluzione

Se stai cercando di estendere questo metodo:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);

Anche se sono sicuro che le estensioni degli oggetti di Khaja funzionerebbero, potresti ottenere prestazioni migliori creando un RouteValueDictionary e passando l'oggetto routeValues, aggiungi i parametri aggiuntivi dal contesto, quindi ritorna utilizzando il sovraccarico ActionLink che accetta un RouteValueDictionary invece di un oggetto:

Questo dovrebbe fare il trucco:

    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);
    }

Altri suggerimenti

La seguente classe di estensione ti fornirà ciò di cui hai bisogno.

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;
    }
}

Suppongo che intendi tipi anonimi qui, ad es. new {Name1 = value1, Name2 = value2} ecc. In tal caso, sei sfortunato: i tipi anonimi sono tipi normali in quanto codice fisso, compilato. Capita solo di essere generati automaticamente.

Quello che potresti è scrivere new {old.Name1, old.Name2, ID = myId} ma non so se è davvero quello che vuoi. Qualche dettaglio in più sulla situazione (inclusi esempi di codice) sarebbe l'ideale.

In alternativa, puoi creare un oggetto contenitore che sempre aveva un ID e qualunque altro oggetto contenesse il resto delle proprietà.

public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}

Questo accetterebbe il valore ID che la casella di testo dovrebbe avere e l'etichetta dovrebbe fare riferimento. Se il consumatore ora non include l '"id" nella proprietà textBoxHtmlAttributes, il metodo creerà un'etichetta errata.

Posso verificare attraverso la riflessione se questo attributo viene aggiunto nell'oggetto labelHtmlAttributes. In tal caso, voglio aggiungerlo o creare un nuovo oggetto anonimo a cui è stato aggiunto. Ma poiché non riesco a creare un nuovo tipo anonimo esaminando i vecchi attributi e aggiungendo il mio "id" attributo, sono un po 'bloccato.

Un contenitore con una proprietà ID fortemente tipizzata e quindi un tipo "anonimo" e attributi; la proprietà richiederebbe riscritture di codice che non pesano fino al " aggiungi un campo id " requisito.

Spero che questa risposta sia comprensibile. È la fine della giornata, non riesco più a mettere in riga il mio cervello ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top