¿Por qué no puedo pasar atributos html a EditorFor()
? p.ej;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
No quiero usar metadatos
Actualización : la solución fue llamar a esto desde la vista:
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
y usar ViewData["Modifiable"]
en mi EditorTemplates / String.ascx personalizado donde tengo cierta lógica de vista que determina si agregar atributos de solo lectura y / o deshabilitados a la entrada El objeto anónimo pasado EditorFor()
es un parámetro llamado additionalViewData
y sus propiedades se pasan a la plantilla del editor en el ViewData
colección.
html
asp.net-mvc
editorfor
Typo Johnson
fuente
fuente
Respuestas:
EditorFor
funciona con metadatos, por lo que si desea agregar atributos html, siempre puede hacerlo . Otra opción es simplemente escribir una plantilla personalizada y usarTextBoxFor
:fuente
PeriodType
? ¿No es una propiedad simple? Si es un objeto complejo, puede personalizar toda la plantilla colocando un parcial en~/Views/ControllerName/EditorTemplates/SomeType.ascx
dondeSomeType
está el nombre del tipo de laPeriodType
propiedad.@class
una plantilla de editor que contenga 3 divs, por ejemplo. El ayudante Html.TextBoxFor le permite definir esto porque sabe lo que genera este ayudante: un cuadro de texto, por lo que tiene sentido definir una clase para un elemento de entrada.La actualización MVC 5.1 ahora admite directamente el siguiente enfoque, por lo que también funciona para el editor incorporado. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (Es un caso de Gran pensamiento mental por igual o leen mi respuesta :)
Fin de actualización
Si está utilizando su propia plantilla de editor o con MVC 5.1, que ahora admite el siguiente enfoque directamente para editores integrados.
luego en su plantilla (no se requiere para tipos simples en MVC 5.1)
fuente
A partir de MVC 5.1, ahora puede hacer lo siguiente:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
fuente
EditorFor
plantillas integradas / predeterminadas . Si implementa la suya, debe seguir la respuesta de AntonK.Ahora ASP.Net MVC 5.1 tiene un soporte integrado para ello.
De las notas de la versión
Por ejemplo:
fuente
Aquí está la sintaxis del código VB.Net para atributos html en MVC 5.1 EditorFor
fuente
¿Por qué no solo usar
fuente
Si no desea usar Metadatos, puede usar un
[UIHint("PeriodType")]
atributo para decorar la propiedad o si es un tipo complejo, no tiene que decorar nada. EditorFor buscará un archivo PeriodType.aspx o ascx en la carpeta EditorTemplates y lo usará en su lugar.fuente
He estado luchando con el mismo problema hoy por una casilla de verificación que se une a un bool anulable, y como no puedo cambiar mi modelo (no mi código) tuve que encontrar una mejor manera de manejar esto. Es un poco fuerza bruta, pero debería funcionar en el 99% de los casos que pueda encontrar. Obviamente, tendría que hacer una población manual de atributos válidos para cada tipo de entrada, pero creo que los obtuve todos para la casilla de verificación.
En mi plantilla de editor Boolean.cshtml:
fuente
Dictionary<string,string> attribs = new Dictionary<string,string>();
yattribs.Add("tabindex","16");
en uno de esos@( )
bloques en la parte superior de mi página. Luego lo hice@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
en mi página y me da un error: "'System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>' no contiene una definición para 'CheckBox' y el mejor método de extensión sobrecarga 'System.Web. Mvc.InputExtensions.CheckBox (System.Web.Mvc.HtmlHelper, string.bool, object) 'tiene algunos argumentos no válidos ".Todavía puedes usar EditorFor. Simplemente pase el estilo / cualquier atributo html como ViewData.
Debido a que EditorFor usa plantillas para renderizar, puede anular la plantilla predeterminada para su propiedad y simplemente pasar el atributo de estilo como ViewData.
Entonces su EditorTemplate desea lo siguiente:
fuente
puedes usar así; mismo resultado con
Html.EditorFor
, y puede agregar sus atributos htmlfuente
TextBoxFor
ignora cualquier tipo deDisplayFormat
eso que esté intentando aplicar.Simplemente cree su propia plantilla para el tipo en Views / Shared / EditorTemplates / MyTypeEditor.vbhtml
Invoque el editor desde su vista con la propiedad modelo:
Perdón por la sintaxis de VB. Así es como rodamos.
fuente
En mi caso, estaba tratando de crear una plantilla de editor de entrada de número HTML5 que pudiera recibir atributos adicionales. Un enfoque más ordenado sería escribir su propio HTML Helper, pero como ya tenía mi plantilla .ascx, seguí este enfoque:
Este bit feo crea una entrada de tipo de número y busca un Diccionario ViewData con la clave "atributos". Recorrerá iterativamente el diccionario agregando sus pares clave / valor como atributos. La expresión regular en el atributo ID no está relacionada y está allí porque cuando se usa en una colección,
GetFullHtmlFieldId()
devuelve una identificación que contiene corchetes de la[]
que normalmente se escaparía como guiones bajos.Esta plantilla se llama así:
Detallado, pero funciona. Probablemente podría usar la reflexión en la plantilla para usar nombres de propiedades como nombres de atributos en lugar de usar un diccionario.
fuente
Establezca la condición usando
ViewData
en el controladorLuego, use estos datos de vista en la plantilla del editor para establecer el atributo html del control
fuente
MVC 5.1 y una solución superior (fusionará los atributos HtmlAttributes locales y se definirán en las plantillas del editor):
Shared \ EditorTemplates \ String.cshtml:
Extensiones:
Uso:
fuente
source1
ysource2
comoIDictionary<string, object>
. Hice esta función:private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }