6

Encontré muchas preguntas simulair pero no una buena solución limpia que funciona. Veo un montón de código personalizado para hacer que esto funcione, pero ¿por qué? ¿No debería funcionar esto desde el principio?Validación MVC DateTime que falla

Lo que creo que es extraño, es que en IE9 funciona, pero en Firefox y Chrome está fallando. Cada vez que intento en Firefox o Chrome, aparece el mensaje "El campo Cumpleaños debe ser una fecha".

Cuando intento el siguiente código en un nuevo proyecto MVC 4 RTM, no consigo que funcione. Veo el DateTime.Now predeterminado como dd-MM-aaaa (Holanda) en todos los navegadores pero no puedo enviarlo en Firefox y Chrome.

La etiqueta de globalización no está configurada en web.config, por lo que debe estar utilizando la predeterminada. Soy de Holanda, así que creo que debería atraer la cultura del cliente.

public class RegisterModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    //[DataType(DataType.Date)] 
    public DateTime Birthday { get; set; } 
} 

[AllowAnonymous] 
    public ActionResult Register() 
    { 
     RegisterModel vm = new RegisterModel() 
     { 
      Birthday = DateTime.Now 
     }; 
     return View(vm); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      try 
      { 
       //WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
       //WebSecurity.Login(model.UserName, model.Password); 
       return RedirectToAction("Index", "Home"); 
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

marcado

<!-- language: lang-none --> 
@model DateTimeWithDatePicker.Models.RegisterModel 
@{ 
    ViewBag.Title = "Register"; 
} 

<hgroup class="title"> 
    <h1>@ViewBag.Title.</h1> 
    <h2>Create a new account.</h2> 
</hgroup> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    <fieldset> 
     <legend>Registration Form</legend> 
     <ol> 
      <li> 
       @Html.LabelFor(m => m.UserName) 
       @Html.TextBoxFor(m => m.UserName) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Birthday) 
       @Html.EditorFor(m => m.Birthday) 
      </li> 
     </ol> 
     <input type="submit" value="Register" /> 
    </fieldset> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

Lo siento, pero no saben cómo dar formato a la MVC Ver arriba. –

Respuesta

3

El problema era la validación de jQuery y localización . Parece que hay archivos de localización para mensajes y métodos del plugin jQuery. Vea mi blog para una explicación detallada del problema y cómo lo resolví.

http://www.locktar.nl/programming/mvc/localization-validation-in-mvc/

Editar: acabo lanzado una nueva entrada en el blog con un refresco de todos los problemas de localización y cómo solucionarlo de una propiedad DateTime. Ver mi nueva publicación MVC localization validation.

+0

He utilizado http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/localization/methods_nl.js, encontré siguiendo su enlace. Esto funcionó bien en IE y Firefox, pero no en Chrome. Chrome admite entrada de fecha html5 y almacena el valor en formato "aaaa-mm-dd". He cambiado la prueba a: if (Modernizr.inputtypes.date) { return true; } else {} –

+0

¿Ha cambiado 1.7 a la última versión? Hace algún tiempo escribí ese blog. Acabo de lanzar mi nuevo sitio de blog en www.locktar.nl. –

1

La etiqueta de la globalización no se encuentra en web.config por lo que debe utilizar el valor por defecto . Soy de Holanda, así que creo que debería atraer la cultura del cliente.

No, eso no es correcto. Podrías estar perfectamente bien desde Holanda y haber configurado tu navegador para usar la cultura china. La razón por la que no puedes hacer que esto funcione es probablemente porque en FF y Chrome no tienes la cultura correcta.

Dado que no ha especificado una cultura en su elemento de globalización en web.config, ASP.NET MVC utilizará la enviada desde el navegador en el encabezado de la solicitud. Por ejemplo si configura su navegador para es-cultura de la siguiente cabecera se ajustará a lo largo de cada solicitud:

Accept-Language:en-US,en;q=0.8 

Así es como este se configura en Chrome:

enter image description here

así que asegúrese Coloca tu idioma deseado primero en la lista.

Y si quieres una manera confiable para utilizar la misma sintaxis que el definido en el atributo DisplayFormat durante la unión se podría escribir un ligante modelo personalizado modelo como se muestra aquí: https://stackoverflow.com/a/7836093/29407

+0

Mi cultura era buena en Firefox y Chrome, así que ese no era el problema. El problema era la validación de jQuery que no funcionaba en Firefox y Chrome de la misma manera que en Internet Explorer. Vea la respuesta de esta publicación y mi blog entra en detalles. –

7

que era capaz de solucionar este problema mediante la modificación de la función de validación de jQuery para fechas:

<script type="text/javascript"> 

    $(function() { 

    var dateFormat="dd/mm/yy"; // en-gb date format, substitute your own 

    $("#Birthday").datepicker({ 
     "dateFormat": dateFormat 
    }); 

    jQuery.validator.addMethod(
     'date', 
     function (value, element, params) { 
      if (this.optional(element)) { 
       return true; 
      }; 
      var result = false; 
      try { 
       $.datepicker.parseDate(dateFormat, value); 
       result = true; 
      } catch (err) { 
       result = false; 
      } 
      return result; 
     }, 
     '' 
    ); 

}); 

+0

Ver mi respuesta sobre mi propio tema. Hice una publicación de blog sobre ella http://stackoverflow.com/a/12346915/801005 –

+1

Intenté su publicación en el blog cuando intentaba resolver este problema. Estoy seguro de que es la mejor solución cuando quiere una solución definitiva para muchos usuarios en diferentes países. Pero el script anterior es adecuado cuando necesita una solución de dos minutos y no le importa la localización para la base de usuarios de varios países. – gls123

Cuestiones relacionadas