2011-02-14 11 views
6

Este código se convirtió de algunos 2 código ASP.Net MVC en este tutorial:
MVC 2 Editor Template with DateTimeASP.Net MVC 3 EditorTemplate para DateTime campos Error

Es un EditorTemplate personalizado para campos DateTime almacenados como 'EditorTemplates/DateTime .cshtml '.

@Model DateTime? 
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) 

Sin embargo, me sale el siguiente error al utilizar @Html.EditorFor(model => model.NewAbsence.StartDate):

CS1973: 'System.Web.Mvc.HtmlHelper' no tiene ningún método aplicable llamado 'Cuadro de texto', pero parece tener un método de extensión por ese nombre. Los métodos de extensión no se pueden distribuir dinámicamente. Considere enviar los argumentos dinámicos o llamar al método de extensión sin la sintaxis del método de extensión.

He visto algunos mensajes similares aquí que mencionan el lanzamiento del parámetro del método EditorFor, sin embargo, parece que no puedo hacer que esto funcione en mi ejemplo.

¿Podría alguien indicar qué debo cambiar en mi código? Gracias.

+0

¿Qué tipo es 'Modelo'? – SLaks

+0

La vista se basa realmente en un modelo de vista que contiene datos personalizados para este formulario. El formulario es un formulario Crear, por lo que model.NewAbsence es del tipo Ausencia que tiene valores predeterminados. Parece que se está accediendo al Editor de placas parcial para que el tipo sea DateTime ?? – Banford

Respuesta

0

Como un trabajo temporal en torno a que estoy usando:

<div class="editor-field date-field"> 
    @Html.EditorFor(model => model.NewAbsence.StartDate) 
    @Html.ValidationMessageFor(model => model.NewAbsence.StartDate) 
</div> 

Luego, utilizando el selector de jQuery:

$(".date-field > input").datepicker({ 
       showOn: "button", 
       buttonImage: "*pathtoimage*" 
      }); 

Para aplicar el selector de fecha para las etiquetas de entrada dentro de div de la 'fecha de campo' . Sin embargo, esto aún no formatea el valor de la fecha como quiero que se muestre inicialmente, y corta completamente la plantilla del editor.

11

en realidad es @model con minúsculas m:

@model DateTime? 
^ 

en lugar de:

mensaje
@Model DateTime? 
+0

Intellisense en navaja de afeitar autocorrecta esto a una M mayúscula? – Banford

+1

@Banford, nunca confíes en Intellisense :-) –

+0

Ok, así que verifiqué mis otras vistas y todas son minúsculas. Cambiarlo a minúsculas ha resaltado esa sección en amarillo. Pero ahora el código está cometiendo errores en la segunda línea en EditorTemplate. Estableciendo eso: CS0103: El nombre 'modelo' no existe en el contexto actual @ Html.TextBox ("", (model.HasValue? Model.Value.ToShortDateString(): string.Empty), new {@class = "datePicker"}) – Banford

0

El error proviene de su estado de cuadro de texto. En una plantilla, esto se convierte en una expresión dinámica, y .Net no sabe cómo escribir las propiedades del Modelo.

@Html.TextBox("", (string)(Model==null ? Model.Value.ToShortDateString() : string.Empty), new { style = "width: 10em;", @class="datefield" }) 

explícitamente emitir su valor de fecha como cadena, y la expresión dinámica tiene la información que necesita. También tuve un problema con la propiedad .HasValue, pero ese no era el punto de su pregunta.

4

Así que para resumir lo que dice la gente y hacerlo un poco más genérico. Si su vista está declarando que acepta modelos dinámicos:

@model dynamic 

Entonces cosas como los métodos de extensión no será capaz de inferir los tipos de argumentos pasados ​​a ellos. He aquí dos ejemplos (usando la maquinilla de afeitar porque es impresionante):

@Html.TextBox("myTextBoxName", Model.MyTextBoxValue) 
@Html.DropDownList("myDropDownName", Model.MySelectList)) 

En estos casos, el motor no se sabe qué tipos Model.MyTextBoxValue o Model.MySelectList son, por lo tanto, no se puede averiguar lo que sobrecarga de los métodos de extensión para compilar.Por lo que sólo ayudar a lo largo con un poco de mecanografía fuerte:

@Html.TextBox("myTextBoxName", (string)Model.MyTextBoxValue) 
@Html.DropDownList("myDropDownName", (SelectList)Model.MySelectList)) 

Por cierto, sólo para evitar que las personas potencialmente tirando de los pelos, que SelectList tiene que ser instanciado adecuadamente con algo como:

var items = List<SelectListItem>(); 
... 
new SelectList(items, "Value", "Text"); 
Cuestiones relacionadas