2011-05-12 19 views
20

Estoy algo perplejo porque, quiero formatear el valor y agregar un atributo html para la clase css.Html.TextBoxFor formateo o Html.EditorFor htmlAttributes?

Si uso @Html.TextBoxFor(m => m.DateModified) - Puedo agregar el atributo html pero el formateo no funciona mediante el atributo DisplayFormat en el miembro.

Si uso @Html.EditorFor(m => m.DateModified) - Formateo de las obras, pero no puedo añadir atributos HTML

Si uso @Html.TextBox("DateModified", Model.DateModified, ...) - consigo excepción de referencia nula cuando el modelo es nula cuando el formulario está en modo de suma

¿Cuál es la mejor manera de lograr esto?

+0

Gracias por esta pregunta, yo estaba teniendo un pequeño problema diff , pero la explicación que brindó en su pregunta también me ayudó. No sabía que en el método EditoFor, no puedo dar atributos html, y el enlace del modelo estaba funcionando de manera horrible en mi caso ... gracias de nuevo. –

Respuesta

17

terminé resolver esto mediante la creación de un editor de plantillas a medida para mi selector de fechas como tan:

Común/EditorTemplates /Fecha y hora.cshtml

@model System.DateTime? 
@Html.TextBox("", Model.HasValue ? Model.Value.ToString("dd/MM/yyyy") : string.Empty, new { @class = "date-picker" }) 

Luego, en mi página original siguen utilizando

@Html.EditorFor(m => m.DateModified) 
+2

Agradable. Muy útil para mí - Me estaba frustrando con esto. – itsmatt

+0

La única modificación que hice para mis propias necesidades fue agregar '@ readonly =" readonly "' ya que uso el jQuery datetime picker - obliga al usuario a elegir una fecha en lugar de preocuparse de que escriba algo ridículo. Puede que no sea aplicable para todos o para todas las situaciones, pero funcionó bastante bien para mí. – itsmatt

+0

Aunque noté que el efecto secundario de hacer eso es que hace que sea difícil borrar una fecha. Probablemente eliminaré ese bit ya que complica las cosas. – itsmatt

10

Usted podría ...

@Html.TextBoxFor(m => m.DateModified, new { Value = Model.DateModified.ToString("MM-dd-yyyy"), @class = "superCoolClassName"}) 
+7

Gracias por esto. He encontrado que la primera propiedad del tipo anónimo "valor" debería de hecho comenzar con una V mayúscula (es decir, "Valor"), de lo contrario no tendría ningún efecto. –

+0

Para que lo sepas, al agregar un valor (con V en mayúscula) se obtienen tanto un valor como un atributo de valor que no es válido cuando verificas tu marcado con el validador de W3.org. – Anton

3

Uso @ Html.EditorFor (m => m.DateModified), porque de lo contrario el atributo formatSalida no tendrá ningún efecto.

Para agregar más atributos como una clase de CSS, debe crear una plantilla de editor para DateTime. Crear un archivo EditorTemplates/DateTime.cshtml con el siguiente contenido:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new 
{ 
    @class="date" 
}) 

Tenga en cuenta que el valor del cuadro de texto no se ajusta con el modelo directamente, sino más bien con la TemplateInfo.FormattedModelValue, debido a que el valor se formateará según el atributo DisplayFormat mientras que el modelo no. (Esto me llevó bastante tiempo darme cuenta. :))

En casos simples, esto podría ser suficiente, p. si la clase CSS puede ser la misma para todos los editores de fecha.

Si desea parametrizar el atributo, puede hacerlo también, pasando el parámetro de valor de atributo al EditorPara.

@Html.EditorFor(m => m.DateModified, new { @class = "someClass" }) 

Sin embargo, este parámetro no será delegada a automágicamente el control HTML como atributo, pero hay que "manejar" en la plantilla de forma explícita. De acuerdo a mi experiencia se puede acceder a este valor de parámetro en el ViewData en la plantilla, por lo que la plantilla parametrizada se ve así:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new 
    { 
     @class=ViewData["class"] 
    }) 
1

Para evitar codificando los pares clave/valor que figuran en EditorFor, convertir el objeto ViewData a una Diccionario y pasar ese objeto de diccionario a TextBox.

por ejemplo

@Html.EditorFor(m => m.DateModified, "Template", new { @class = "someClass", size=8 , htmlTag="custom" }) 

Y en la plantilla que tiene

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, ViewData.ToDictionary(c=>c.Key,c=>.Value)) 
0

Para mostrar la fecha JSON en el cuadro de texto (cshtml):

var d1 = ui.item.IssueDate; 
var d = new Date(parseInt(d1.slice(6, -2))); 
var Issdate = ("0" + (d.getMonth() + 1)).slice(-2) + '/' + 
       ("0" + d.getDate()).slice(-2) + '/' + 
       d.getFullYear().toString(); 
$('#IssueDate').val(Issdate); 
Cuestiones relacionadas