Por que não posso transmitir atributos html para EditorFor()
? por exemplo;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
Não quero usar metadados
Atualização : a solução foi chamar isso da exibição:
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
e uso ViewData["Modifiable"]
em meu EditorTemplates / String.ascx personalizado, onde tenho alguma lógica de exibição que determina se deve adicionar atributos somente leitura e / ou desativados à entrada. O objeto anônimo passado EditorFor()
é um parâmetro chamado additionalViewData
e suas propriedades são passadas para o modelo de editor no diretório ViewData
coleção.
html
asp.net-mvc
editorfor
Typo Johnson
fonte
fonte
Respostas:
EditorFor
funciona com metadados; portanto, se você quiser adicionar atributos html, sempre poderá fazê-lo . Outra opção é simplesmente escrever um modelo personalizado e usarTextBoxFor
:fonte
PeriodType
? Não é uma propriedade simples? Se for um objeto complexo, você poderá personalizar o modelo inteiro colocando um parcial em~/Views/ControllerName/EditorTemplates/SomeType.ascx
ondeSomeType
está o nome do tipo daPeriodType
propriedade.@class
um modelo de editor que contenha 3 divs, por exemplo. O auxiliar Html.TextBoxFor permite definir isso porque você sabe o que esse auxiliar gera - uma caixa de texto, portanto faz sentido definir uma classe para um elemento de entrada.A atualização MVC 5.1 agora suporta diretamente a abordagem abaixo, portanto também funciona para o editor incorporado. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (Ou é um caso de uma grande mente pensando da mesma forma ou eles leem minha resposta :)
Finalizar atualização
Se você estiver usando seu próprio modelo de editor ou com o MVC 5.1, que agora suporta a abordagem abaixo diretamente para editores internos.
depois no seu modelo (não é necessário para tipos simples no MVC 5.1)
fonte
A partir do MVC 5.1, agora você pode fazer o seguinte:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
fonte
EditorFor
modelos internos / padrão . Se você implementar o seu próprio, deverá seguir a resposta do AntonK.Agora, o ASP.Net MVC 5.1 recebeu um suporte integrado.
Das notas de versão
Por exemplo:
fonte
Aqui está a sintaxe do código VB.Net para atributos html no MVC 5.1 Editor
fonte
Por que não usar apenas
fonte
Se você não quiser usar os metadados, poderá usar um
[UIHint("PeriodType")]
atributo para decorar a propriedade ou, se for um tipo complexo, não precisará decorar nada. O EditorFor procurará um arquivo PeriodType.aspx ou ascx na pasta EditorTemplates e o utilizará.fonte
Hoje estou lutando com o mesmo problema em uma caixa de seleção que se liga a um bool anulável e, como não consigo alterar meu modelo (não meu código), tive que criar uma maneira melhor de lidar com isso. É um pouco de força bruta, mas deve funcionar em 99% dos casos que eu possa encontrar. Você obviamente teria que fazer uma população manual de atributos válidos para cada tipo de entrada, mas acho que consegui todos eles para a caixa de seleção.
No meu modelo de editor Boolean.cshtml:
fonte
Dictionary<string,string> attribs = new Dictionary<string,string>();
eattribs.Add("tabindex","16");
em um desses@( )
blocos na parte superior da minha página. Então eu fiz@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
na minha página e isso me dá um erro: "'System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>' não contém uma definição para 'CheckBox' e o melhor método de extensão sobrecarrega 'System.Web. Mvc.InputExtensions.CheckBox (System.Web.Mvc.HtmlHelper, string.bool, object) 'possui alguns argumentos inválidos ".Você ainda pode usar o EditorFor. Basta passar o estilo / qualquer atributo html como ViewData.
Como o EditorFor usa modelos para renderizar, você pode substituir o modelo padrão para sua propriedade e simplesmente passar o atributo de estilo como ViewData.
Portanto, seu EditorTemplate gostaria do seguinte:
fonte
você pode usar assim; mesma saída com
Html.EditorFor
, e você pode adicionar seus atributos htmlfonte
TextBoxFor
ignora qualquer tipoDisplayFormat
que você possa estar tentando aplicar.Basta criar seu próprio modelo para o tipo em Views / Shared / EditorTemplates / MyTypeEditor.vbhtml
Chame o editor da sua visualização com a propriedade model:
Perdoe a sintaxe do VB. É assim que rolamos.
fonte
No meu caso, eu estava tentando criar um modelo de editor de entrada de número HTML5 que pudesse receber atributos adicionais. Uma abordagem mais organizada seria escrever seu próprio HTML Helper, mas como eu já tinha meu modelo .ascx, segui essa abordagem:
Este bit feio cria uma entrada de tipo numérico e procura um dicionário ViewData com a chave "attribute". Ele irá percorrer o dicionário adicionando seus pares chave / valor como atributos. O Regex no atributo ID não está relacionado e existe porque, quando usado em uma coleção,
GetFullHtmlFieldId()
retorna um ID contendo colchetes[]
quais normalmente ele poderia escapar como sublinhados.Este modelo é chamado assim:
Detalhado, mas funciona. Você provavelmente poderia usar a reflexão no modelo para usar nomes de propriedades como nomes de atributos, em vez de usar um dicionário.
fonte
Defina a condição usando
ViewData
no controladorEm seguida, use esses dados de visualização no modelo do editor para definir o atributo html do controle
fonte
MVC 5.1 e uma solução superior (mesclará HtmlAttributes locais e definidos no EditorTemplates):
Shared \ EditorTemplates \ String.cshtml:
Extensões:
Uso:
fonte
source1
esource2
comoIDictionary<string, object>
. Eu fiz esta função:private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }