2011-02-03 10 views
18

Estoy usando asp.net mvc 3 y sigo recibiendo este error y no lo entiendo ya que no estoy usando una plantilla.¿Obtiene un error de plantilla cuando trato de hacer esto?

tengo esto en mi vista parcial

@model ViewModels.FormViewModel 

    <div="tabs-1"> 
     @Html.TextBoxFor(x => x.Due.ToShortDateString()) 
    </div> 

en mi modelo de vista

public class FormViewModel 
    { 
     public DateTime Due { get; set; } 


     public FormViewModel() 
     { 
      DueDate = DateTime.UtcNow;   
     } 
    } 

y me sale este error

plantillas se pueden utilizar solamente con el acceso de campo , propiedad acceso, índice de matriz de dimensión única o singl e-parameter custom indexer expresiones. Descripción: Ocurrió una excepción no controlada durante la ejecución de la solicitud web actual . Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó el código .

Detalles de excepciones: System.InvalidOperationException: plantillas sólo se pueden utilizar con el acceso de campo , acceso a la propiedad, índice de matriz de una sola dimensión, o de un solo parámetro personalizado indexador expresiones.

Respuesta

51

debería ser así:

@Html.TextBoxFor(x => x.Due) 

Y si quieres algo de formato para esta fecha:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
public DateTime Due { get; set; } 

y luego:

@Html.EditorFor(x => x.Due) 

de si realmente quiere para usar este método .ToShortDateString(), necesita usar un ty no fuerte ayudante de ped (obviamente eso es algo que recomendaría en contra):

@Html.TextBox("Due", Model.Due.ToShortDateString()) 
+1

@Darin Dimitrov - Ok, creo que utilicé un mal ejemplo, ya que de todos modos se procesa en una cadena. Di si quiero usar "ToShortDateString()" ¿por qué no puedo usarlo? – chobo2

+0

@ chobo2, puede especificar formatos usando el atributo 'DisplayFormat' y el helper' Html.EditorFor'. –

+0

@Darin Dimitrov - entonces, ¿qué estoy usando se considera una plantilla? Entonces cualquiera de los ayudantes son plantillas y para modificarlas, ¿o las tengo que editar como dijo Tomas Lycken o usar anotaciones de datos para hacer el look? – chobo2

5

que está recibiendo el error porque el .TextBoxFor() html ayudante utiliza una (un cuadro de texto para la entrada de cadena) incorporado en la plantilla, y que está dando es una expresión lambda que es demasiado complicada (es decir, no pertenece al conjunto de tipos enumerados en el mensaje).

Para solucionar el problema, cambie el tipo de propiedad que desea editar a string, de modo que MVC pueda usar la plantilla de cadena predeterminada o deje que MVC use la plantilla predeterminada de fecha y hora. Me gustaría recomendar este último:

@Html.TextBoxFor(m => m.Due) 

Si no está satisfecho con la forma en que se les pide a los usuarios editar una fecha, ponga una vista parcial llamado "DateTime.cshtml" en ~/Views/Shared/EditorTemplates donde construyes el editor para que funcione de la manera que quieras.

+0

@Tomas Lycken: ¿Es nuevo, nunca recuerdo haber tenido problemas antes de empezar a usar la afeitadora? Si construyera el mío, ¿todas las fechas obtendrían esto? Incluso los que no me gustaría? Como, por ejemplo, si quisiera que solo una de las fechas tenga un ToShortDateString() pero que todas las demás tengan solo un render como predeterminado, ¿podría hacerse esto? – chobo2

+0

@ Tomas Lycken, entonces ¿qué hice fue demasiado complicado? ¿No lo convierte primero en una cadena y luego lo coloca en el cuadro de texto? ¿Dónde puedo leer más sobre esto? (Acerca de lo que estos para el cuadro de texto pueden manejar) simplemente parece tan extraño – chobo2

+0

@ chobo2: El problema no es que sea una cosa muy complicada * render * - es solo que la conexión al El nombre de la propiedad ViewModel (que se usará para el atributo 'name' del campo de entrada) se vuelve mucho más complicado una vez que permite declaraciones más profundas que las enumeradas en su mensaje de error. Si desea afectar el resultado de sus fechas, use el atributo '[DisplayFormat]' (o uno de los otros atributos disponibles) o cree su propia plantilla. –

5

Si está utilizando MVC y tiene un elemento de código en línea, intente establecer un parámetro como este -

@{ 
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString(); 

} 

@Html.DisplayFor(model => parameterValue) 
+0

No necesitaba DateTime.Parse simplemente string string datevalue = item.LastUpdate.ToShortDateString(); –

6

Hay una sobrecarga que puede ayudar a lograr esto, mientras se mantiene inflexible.

// Specify that you're providing the format argument (string) 
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString()) 

// Or use the overload with format and html options, where null is the htmloptions 
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null) 
0

Estáis mal guiando a la aplicación por los que pasa un método en el parámetro de textboxfor en lugar de pasar una expresión.

TENIDO:

@Html.TextBoxFor(x => x.Due.ToShortDateString()) 

almacenará el resultado en una variable y luego usar una expresión. Prueba este

var shortDate = Model.Due.ToShortDateString(); 
@Html.TextBoxFor(x => shortDate) 
0

En lugar de añadir formato en el modelo de uso @value Anotaciones como abajo

@ Html.TextBoxFor (x => x.Due nueva {@ = Valor Model.Due.ToShortDateString()})

Cuestiones relacionadas