2010-11-29 9 views
5
<%: Html.EditorFor(model => model.date)%> 

¿Cómo puedo hacer que este código muestre un cuadro de texto vacío cuando se carga? Model.date no puede contener nulos, por lo tanto, siempre muestra un valor no vacío. ¿Cómo puedo obligarlo a comenzar con un valor vacío?EditorPara (fecha): ¿Cómo mostrar el cuadro de texto vacío?

Nota: No quiero que sea nulo porque en el código real, está vinculado a una propiedad modelo que debe tener un valor (por cierto, tengo una anotación de datos Required para esa propiedad). No tiene sentido hacerlo nulo. Reemplazarlo por una fecha predeterminada como la de hoy no es una opción tampoco porque el punto en este caso es para asegurarse de que el usuario no se olvide de activamente especifique una fecha.

TIA.

Respuesta

8

El problema es si la propiedad Model.Date no se puede anular, entonces siempre tendrá un valor. En el pasado, he creado una plantilla de editor para DateTime (que también utiliza el selector de fecha jquery). Esto le permite manejar su valor vacío para el que presumiblemente debería estar buscando la fecha que iguala a DateTime.MinValue.

Por lo que su editor de plantillas sería algo como:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %> 
<%=Html.TextBox("", (Model != DateTime.MinValue ? Model : string.Empty)) %> 

Usted no necesita preocuparse por la cadena vacía para el nombre que este hecho se rellena con sólo el prefijo html, que debería ser suficiente.

Este artículo también describe cómo crear la plantilla del editor.

http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx

Personalmente me gustaría tener el DateTime en mi opinión el modelo anulable pero no en mi modelo de dominio utilizando la validación en el medio

+0

Personalmente, tengo el DateTime en mi modelo de vista con nullable pero no en mi modelo de dominio usando la validación en el medio. – Mark

+0

Mark, esto suena muy interesante. Lo intentaré de inmediato. Por cierto, en tu comentario, lo lees en mi mente. Eso es lo que iba a hacer en ausencia de una buena solución. Nitpickers incluso puede argumentar que solo null puede coincidir con una cadena vacía. No DateTime.MinValue. Debo decir que estoy en desacuerdo, ya que una cadena vacía nunca debe tocar el servidor: debe ser descartada por validación del lado del cliente. –

0

Me gustaría poner esto en un <td> o <div> y luego utilizar la propiedad id para acceder y en blanco a través de jquery.

<script type="text/javascript"> 
$(document).ready(function(){ 
$("#clearme").html(""); 
}); 
</script> 

<div id="clearme"> 
<%: Html.EditorFor(model => model.date)%> 
</div> 

Puede haber una forma de utilizar una función MVC incorporada pero no conozco ninguna.

Here es un violín rápido que le muestra el concepto, por lo que puede jugar con él si lo desea.

+0

Jon, gracias por su respuesta. Demasiado lejos del principio de "separación de preocupaciones". –

+0

No estoy tan seguro de que lo haga, ¡pero tampoco conozco su aplicación! Estoy viendo esto como un problema de UI, quiere que cierto campo de IU esté en blanco en lugar de poblar en la carga. Esto podría lograrse desde el lado del servidor, sea el acceso a los datos o la lógica de negocios (me gustan las ideas del modelo de vista), o la capa de presentación del cliente (usando el jquery anterior). En términos de SoC, usted no completa realmente ninguna lógica de negocios o acceso a datos en su capa de presentación, simplemente cambia la forma en que desea que se muestre un campo, cayendo dentro del nivel de la capa de presentación. Pero esa es mi interpretación, no la tuya =) – JonVD

+0

Mi interpretación es que agregas una identificación div y algún código del lado del cliente para solucionar un problema del lado del servidor. –

-1

Se puede utilizar una pequeña función de jQuery.

resuelvo mi problema como este:

 @if(Model.HolidayDate <= DateTime.MinValue) 
     { 
      @Html.TextBoxFor(model => model.HolidayDate, new { @class = "datepick", @style = "width: 75px;", @id="dataInput"}) 
     } 
     else 
     { 
      @Html.TextBoxFor(model => model.HolidayDate, new { @class = "datepick", @style = "width: 75px;"}) 
     } 

y al final de la página:

$ (function() { $ ('# DataInput') .val (''); });
2
  1. En su modelo de crear una propiedad de los hermanos y se adorna con requerido:

    [Required] 
    DateTime? CustomDate { 
        get { return date==default(DateTime)?null:date; } 
        set { date = value; } 
    } 
    
  2. En su opinión reemplazar su entrada con:

    <%:Html.EditorFor(model => model.CustomDate)%> 
    
+0

¡Esa es una buena pista! – tonjo

0

algunas correcciones en La respuesta de Jorge:

public DateTime DOB { get; set; } 
[Required] 
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
[DataType(DataType.Date)] 
public DateTime? NullableDOB 
{ 
    get => DOB.ToNullable(); 
    set => DOB = value.DefaultIfNull(); 
} 

ToNullible(), DefaultIfNull() y IsNull() son un práctico funciones de extensión:

public static T? ToNullable<T>(this T source) where T : struct 
    => source.IsNull(default(T)) ? (T?)null : source; 

public static T? ToNullable<T>(this T source, T @default) where T : struct 
    => source.IsNull(@default) ? (T?)null : source; 

public static T DefaultIfNull<T>(this T? source, T @default) where T : struct 
    => source ?? @default; 

public static T DefaultIfNull<T>(this T? source) where T : struct 
    => DefaultIfNull(source, default(T)); 


public static bool IsNull<T>(this T source) where T : struct 
    => source.Equals(default(T)); 
Cuestiones relacionadas