7

Ho un campo della data (sto usando il DatePicker jQuery UI) in una forma che è stato formattato, in questo modo:MVC3 discreto Data Validation su una data formattata personalizzato

ViewModel

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

View

@Html.EditorFor(m => m.FooDate) 

Questo dimostra correttamente la data il modo in cui voglio io, ad esempio, 09-Nov-2011

Il problema che si verifica, si verifica quando si preme Invia. Continua a dirmi che la data non è valida .... È valida, stupida cosa!

C'è un modo, posso ottenere jQuery/discreto javascript per ignorare questo campo o consentire questo formato per passare? Finora, l'unico modo per far funzionare il modulo è se non formattare la data o utilizzare {0: d} come formato di data per esso.

Edit: Ho creato un layout di totalmente separata + vista + controller + modello per testare questa cosa stupida. Ancora non funziona in IE/Safari. Ho gli ultimi file jquery.validate/discreti da nuget.

Il mio layout è vuoto. E 'appena carica i seguenti file:

"jquery-1.7.min.js" 
"jquery-ui-1.8.16.min.js" 
"jquery.validate.min.js" 
"jquery.validate.unobtrusive.min.js" 

mio TestViewModel è semplice:

public class TestViewModel 
{ 
    [Display(Name = "Test Date:")] 
    [DisplayFormat(DataFormatString = "{0:dd/MMM/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime? TestDate { get; set; } 
} 

mio TestController va come segue:

public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     var m = new TestViewModel(); 
     m.TestDate = DateTime.Now; 
     return View(m); 
    } 
} 

mio punto di vista:

@using (Html.BeginForm()) 
{ 
    ViewContext.FormContext.ValidationSummaryId = "valSumId"; 
    @Html.ValidationSummary(false, "The following errors were found:"); 
    @Html.AntiForgeryToken() 

    @Html.LabelFor(m => m.TestDate) 
    <input type="date" id="TestDate" value="@Model.TestDate.Value.ToString("dd/MMM/yyyy")" /> 
    <input type="submit" /> 
} 

No worky.

Sai qual è la cosa fastidiosa? Se cambio TestDate in una stringa, non riesce ancora.

+0

hai impostato lo stesso formato di data quando dichiari il datepicker? $ ('# data'). datepicker ({ constrainInput: true, dateFormat: 'D, dd Myy' ... qualcosa come questo – shennyL

+0

Sì. Ho caricato una data predefinita dalla vista quando la pagina viene caricata e ancora non mi piace – jzm

+0

Per il mio caso, ho formato Dint nel modello, lo faccio direttamente in vista usando string.format e la convalida è passata. Forse puoi provare :) – shennyL

risposta

3

Quindi sembra jquery.validate.unobtrusive ha un problema con input type="date". Questo deve essere un bug che si verifica solo in IE e Safari.

Quando ho rimosso il file js discreto, ha inviato il modulo fine. Quando ho aggiunto il file js non invadente e ho modificato il tipo di input in testo, ha funzionato.

Bug fastidioso. Ha bisogno di essere risolto.

+0

Mentre sono d'accordo con i fatti espressi in questa risposta, non vorrei rimuovere il js discreto .. [c'è questa correzione che aiuta i miei browser MSIE e Chrome a essere più felici] (http://stackoverflow.com/questions/12845817/asp- net-mvc-set-validation-date-format-fail-on-chrome), comporta l'aggiunta di un metodo 'date' all'oggetto validator – bkwdesign

+0

[Questo è un altro ritocco per gestire un problema iOS] (http: // blog. wassupy.com/2012/07/patching-jquery-va lidation-for-ios-date.html) comporta anche un aggiustamento al metodo di data del validatore Se si incolla questo snippet dopo lo snippet collegato al mio commento precedente, questo combinerà efficacemente la logica precedente con il proprio – bkwdesign

+0

Ho postato il mio per prima cosa commenta un po 'frettolosamente .. mentre tratta in qualche modo del tuo problema, sta anche cercando di ottenere un datepicker dell'interfaccia utente jQuery per giocare con i campi data. Il concetto è ancora applicabile ... e per essere chiari, immagino che ciò di cui abbiamo a che fare stia superando (non "aggiungendo") il metodo "data" dell'oggetto validatore che è esposto nel file js discreto. – bkwdesign

2

ci sono davvero due cose qui:

  1. validazione lato client
  2. validazione lato server

entrambi dovrebbero utilizzare lo stesso formato per questo al lavoro. Iniziamo con la convalida del lato server. È possibile scrivere un raccoglitore modello personalizzato per i campi DateTime che utilizzeranno il formato specificato per la visualizzazione al termine del binding. Ecco uno example of such model binder.

Successivamente dobbiamo occuparci della convalida del lato client. Per questo si potrebbe scrivere una regola personalizzata che sarà allegato agli elementi forniti:

<script type="text/javascript"> 
    $.validator.addMethod(
     'myDateFormat', function (value, element) { 
      // TODO: put your validation logic here that will parse the string 
      // and validate it 
      return false; 
     }, 
     'Please enter a date in the format dd-MMM-yyyy' 
    ); 

    $(function() { 
     // we attach the custom validation rule to the given input element 
     $('#FooDate').rules('add', 'myDateFormat'); 
    }); 
</script> 

Si potrebbe anche usare adapters with a custom attribute.

0

Hai provato semplicemente cambiando il tipo da:

@Html.TextBoxFor(model => model.startDate, new { @class = "date" }) 

ho avuto lo stesso problema con EditorFor ... così ho cambiato in questo e poi applicato il mio jquery datepicker alla 'data' class aggiunto nella casella di testo.

1

per il mio caso, io uso il campo di testo per la data, in modo che non ha ancora causare problemi per la convalida jQuery:

<div class="editor-field"> 
    @Html.TextBox("ExpiryDate", String.Format("{0:ddd, dd MMM yyyy}", DateTime.Now), new { id = "expirydate" }) 
    @Html.ValidationMessageFor(model => model.ExpiryDate) 
</div> 

Allora, perché non si tenta di formattare la data come questo invece di utilizzare l'input type = Data?

Spero che questo aiuto :)

-1

ho avuto lo stesso problema, mi stava guidando banane! Fondamentalmente, la convalida di mvc renderizzerà sempre gli oggetti DateTime per richiedere un valore nella casella di testo. Perché? Perché è direttamente associato a un oggetto DateTime. Se dichiari il tuo ViewModel con un? simbolo, lo renderai nullable. In questo modo non ti darà fastidio la convalida richiede:

public class MyViewModel 
{ 
    DateTime? StartDate { get; set; } 
} 

Spero che questo aiuti

0

Volevo solo fare un piccolo commento su questa linea se qualcun altro ha problemi con questo più tardi:

<input type="date" id="TestDate" value="@Model.TestDate.Value.ToString("dd/MMM/yyyy")" /> 

In alcuni casi (almeno il mio caso prima) ciò si tradurrebbe in questo formato: "01.01.2012", perché con alcune culture non è possibile specificare barre come quella per ottenerle formattate in quel modo, le trasformerà semplicemente in punti, quindi ho dovuto scrivere:

@Model.TestDate.Value.ToString("dd\/MMM\/yyyy"); 

Quale mi ha dato "01/01/2012".

4

penso che ci sia un problema con trattino ("-") nella stringa di formato:

[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = true)] 

Sembra che la convalida discreto non accetta trattino per la formattazione della data di default.

Nel mio caso ho dovuto aggiungere personalizzato metodo sul lato client:

$.validator.methods.date = function (value, element) { 
    var s = value; 
    s = value.replace(/\-/g, '/'); 

    return this.optional(element) || !/Invalid|NaN/.test(new Date(s)); 
}; 

come attuata here

0

Piuttosto vecchio questo thread. Sono appena atterrato qui avendo problemi simili. In un altro thread ho letto che potrebbe esserci un problema con l'incompatibilità della versione da parte di tutte queste librerie * .js introdotte in qualche modo nella convalida. Forse il seguente link può aiutare altri lettori Landig qui: https://stackoverflow.com/a/16551039

Spero che questo aiuti

1

In realtà non è bug del browser, problemi di convalida del client possono verificarsi a causa di MVC bug (anche in MVC 5) in jquery.validate.unobtrusive.min.js che non accetta il formato data/datetime in alcun modo. Sfortunatamente devi risolverlo manualmente.

La mia soluzione, infine, lavorare:

Dovete includere prima:

@Scripts.Render("~/Scripts/jquery-3.1.1.js") 
@Scripts.Render("~/Scripts/jquery.validate.min.js") 
@Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js") 
@Scripts.Render("~/Scripts/moment.js") 

È possibile installare moment.js utilizzando:

Install-Package Moment.js 

E poi si può finalmente aggiungere correzione per il parser del formato della data:

$(function() { 
    $.validator.methods.date = function (value, element) { 
     return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid(); 
    } 
}); 
1

Come Lukyer ha pubblicato, ci possono essere problemi relativi ai file jquery.validate * .min.js, specialmente se in questi file è stata aggiunta la propria convalida. La semplice risposta che ho trovato che ha funzionato per me quando il sistema di rilascio finale non è riuscito a convalidare le date in IE (Chrome ha funzionato senza problemi) era semplicemente rimuovere completamente i file di convalida minificati preconfezionati e lasciare che la bestia gestisse la propria minificazione dal "master" " File. L'unica vergogna è stata che non ho collegato la risposta di Lukyer alla soluzione in precedenza ...

(Probabilmente lo posterei come commento ma a quanto pare non ho ancora ottenuto un rappresentante abbastanza: deve provare più difficile!)

Problemi correlati