Pergunta

Eu uso um objeto anônimo para passar meu atributos HTML para alguns métodos auxiliares. Se o consumidor não adicionar um atributo ID, quero adicioná-lo no meu método auxiliar.

Como posso adicionar um atributo a este objeto anônimo?

Foi útil?

Solução

Se você está tentando estender esse método:

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

Embora eu tenho certeza extensões de objetos de Khaja iria funcionar, você pode obter um melhor desempenho, criando um RouteValueDictionary e passando nas routeValues ??objeto, adicionar seus parâmetros adicionais a partir do contexto, em seguida, retornar usando a sobrecarga ActionLink que leva um RouteValueDictionary em vez de um objeto:

Isso deve fazer o truque:

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

Outras dicas

A seguir classe de extensão iria conseguir o que você precisa.

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

Eu suponho que você quer dizer tipos anônimos aqui, por exemplo, new { Name1=value1, Name2=value2} etc. Se assim for, você está fora de sorte - tipos anônimos são tipos normais em que eles estão fixos, o código compilado. Eles só acontecerá a ser gerada automaticamente.

O que você poderia fazer é escrever new { old.Name1, old.Name2, ID=myId } mas eu não sei se isso é realmente o que você quer. Alguns mais detalhes sobre a situação (incluindo amostras de código) seria o ideal.

Como alternativa, você pode criar um objeto de recipiente que sempre tinha um ID e qualquer outro objeto contido o resto das propriedades.

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

Este seria aceitar o valor ID de caixa de texto deve ter e o rótulo deve referir-se. Se o consumidor já não inclui a propriedade "id" no textBoxHtmlAttributes, o método irá criar um rótulo incorreto.

posso verificar através da reflexão se este atributo é adicionado no objeto labelHtmlAttributes. Se assim for, eu quero adicioná-lo ou criar um novo objeto anônimo que tem acrescentou. Mas porque eu não posso criar um novo tipo anônimo Ao percorrer os antigos atributos e adicionando meu próprio atributo "id", eu sou o tipo de preso.

Um recipiente com uma propriedade ID fortemente digitado e, em seguida, um anônimo digitado "atributos" propriedade exigiria reescrever código que não pesam até o "adicionar um campo id" exigência.

Hope esta resposta é compreensível. É o fim do dia, não é possível obter o meu cérebro em linha mais ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top