Pergunta

Se eu estou passando HtmlAttributes em um modelo, como este:

@Html.DisplayFor(m => m.FirstName, new { htmlAttributes = new { @class = "orangetxt strongtxt" } })

No meu modelo, como eu iria injetar estas no meu de HTML:

<span @ViewData["htmlAttributes"]>@Model</span>

Esta quase funciona, mas algumas muito estranhas coisas, então eu estou supondo que este não é o caminho a percorrer.

Sei que posso fazer isso com um HtmlHelper método de extensão para processar o HTML completo (elemento de span, neste caso) e passar os atributos de que maneira, mas há uma maneira para apenas compor atributos diretamente em um elemento HTML, como no exemplo acima?

Foi útil?

Solução

O método abaixo extensão vai permitir-me para converter htmlAttributes para uma string:

    public static MvcHtmlString RenderHtmlAttributes<TModel>(
        this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
    {
        var attrbituesDictionary = new RouteValueDictionary(htmlAttributes);

        return MvcHtmlString.Create(String.Join(" ", 
            attrbituesDictionary.Select(
                item => String.Format("{0}=\"{1}\"", item.Key, 
                htmlHelper.Encode(item.Value)))));
    }

Então, para torná-los dentro da tag, eu só posso fazer isso:

<span @Html.RenderHtmlAttributes(ViewData["htmlAttributes"])>@Model</span>

Outras dicas

A resposta de Jerad Rose é bom, mas eu corri para alguns problemas com ele:

  • Não não converter sublinhados para traços nos nomes de atributos
  • Não lidar com atributos sem valor graciosamente

Para resolver primeira emissão, utilização HtmlHelper.AnonymousObjectToHtmlAttributes.

Abaixo está a minha modificação do método de Jerad:

public static MvcHtmlString RenderHtmlAttributes(this HtmlHelper helper, object htmlAttributes)
{
        if (htmlAttributes == null) return new MvcHtmlString(String.Empty);
        var attrbituesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        return new MvcHtmlString(String.Join(" ", attrbituesDictionary.Select(item => string.IsNullOrEmpty((string)item.Value) ? String.Format("{0}", item.Key) : String.Format("{0}=\"{1}\"", item.Key, helper.Encode(item.Value)))));
}

Tente isto em vez disso,

@Html.DisplayFor(m => m.FirstName, 
                 new { htmlAttributes = "class = orangetxt strongtxt"})

Este irá processar uma corda, enquanto a sua versão fez coisas estranhas, prestados { } como parte da saída.

DisplayFor() é utilizado para compor o modelo que coincide com o tipo de propriedade.

Modelos de apresentação são .cshtml arquivos dentro /DisplayTemplates pasta que por sua vez está dentro de uma pasta de vista (por exemplo,qualquer pasta de Casa, Compartilhado ou até mesmo um controlador específico).

Um exemplo.

Se você tiver um Seqüência de caracteres.cshtml modelo como esse dentro /Views/Shared:

@model String

@if (string.IsNullOrEmpty(Model)) {
   <span>(no string)</span>
}
else {
   <span>@Model</span>
}

Cada vez que você chamar DisplayFor() para uma propriedade de seqüência de caracteres:

DisplayFor(model => model.MyStringProperty);

Ele processa o modelo de acordo para a cadeia de valor.Você pode ser mais específico e colocar /DisplayTemplates dentro de um específico modo de Exibição de pasta e apenas a eles, chamadas a partir desses pontos de vista, são afetados pelo modelo.


No seu caso, você pode ser ainda mais específico e chamada de DisplayFor() com um determinado modelo.

Suponha que você tenha um modelo para uma determinada propriedade, chamado MyPropertyTemplate.cshtml.Você chamaria DisplayFor() como esta:

DisplayFor(model => model.MyProperty, "MyPropertyTemplate");

E, dentro desse modelo, você pode ter o que quer que atributos HTML que você deseja.

@model MyProperty

<span class="orangetxt strongtxt">@MyProperty.ToString()</span>

PS:Quando não encontrar um modelo que eu acho que ele apenas chama model.Property.ToString() sem html adicional.

FYI: EditorFor(), como , por exemplo, funciona de uma forma semelhante, mas usa /EditorTemplates a pasta.

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