2015-06-02 3 views
0

Моя модель класса недвижимости выглядит следующим образомОшибка при проверке даты MVC

public DateTime PurchaseDate { get; set; } 

и внутренний вид

@Html.TextBoxFor(model => model.PurchaseDate, new { @class = "form-control date-picker" }) 
@Html.ValidationMessageFor(model => model.PurchaseDate) 

и я даю дату, как это в форме

19/06/2015 

Но он дает подтверждение и не разрешает отправку страницы, это сообщение

The field PurchaseDate must be a date. 

если я даю дату в формате mm/dd/yyyy, это работает. Может ли кто-нибудь указать, что я здесь делаю неправильно?

+0

Вы можете использовать 'jquery.globalize' или переопределить Jquery валидатор на дату согласно [этот ответ] (http://stackoverflow.com/questions/27285458/jquery-ui-datepicker- and-mvc-view-model-type-datetime/27286969 # 27286969) –

+0

Вы можете указать формат в модели. – Mairaj

+0

@ StephenMuecke не работает – Athul

ответ

2

Ошибка на стороне клиента возникает из-за по умолчанию jquery.validate проверяет значение используя формат MM/dd/yyyy. Вы можете переопределить функцию $.validator.addMethod('date', function (value, element), чтобы проверить, что это значение находится в ожидаемом dd/MM/yyyy. Обратите внимание на следующий код из моей JQuery плагин, связанный с методом @Html.DatePickerFor() хелперов, который делает атрибут data-dateformat на выходе на основе культуры серверов, так что это может быть избыточна для ваших потребностей

Добавить следующие сценарии (не в document.ready, но после того, как jquery.validate.unobtrusive)

Date.prototype.isValid = function() { 
    return !isNaN(this.getTime()); 
} 

globalDate = function (value, formatString) { 
    // Initialise a new date 
    var date = new Date(); 
    date.setHours(0, 0, 0, 0); 
    if (value == undefined) { 
    // Return todays date 
    return date; 
    } 
    // Get the components of the format 
    // The separator can be forward slash, hyphen, dot and/or space 
    var regex = new RegExp(/([dMy]+)([\s/.-]+)([dMy]+)([\s/.-]+)([dMy]+)/); 
    //var format = regex.exec(this.inputFormat); 
    var format = regex.exec(formatString); 
    // Get the components of the value 
    regex = new RegExp(/(\d+)([\s/.-]+)(\d+)([\s/.-]+)(\d+)/); 
    value = regex.exec(value); 
    // Check the value is valid 
    if (value === null || value[2] !== format[2] || value[4] !== format[4]) { 
    // Its not valid 
    date.setTime(Number.NaN); 
    return date; 
    } 
    // TODO: What if year entered as 2 digits? 
    var day = Number.NaN; 
    var month = Number.NaN; 
    var year = Number.NAN; 
    if (format[1].charAt(0) === 'd') { 
    // little-endian (day, month, year) 
    day = parseInt(value[1]); 
    month = parseInt(value[3]) - 1; 
    year = parseInt(value[5]); 
    } else if (format[1].charAt(0) === 'M') { 
    // middle-endian (month, day, year) 
    day = parseInt(value[3]); 
    month = parseInt(value[1]) - 1; 
    year = parseInt(value[5]); 
    } else { 
    // big endian (year, month, day) 
    day = parseInt(value[5]); 
    month = parseInt(value[3]) - 1; 
    year = parseInt(value[1]); 
    } 
    date.setFullYear(year); 
    date.setMonth(month); 
    date.setDate(day); 
    // Check its valid 
    if (date.getDate() !== day || date.getMonth() !== month || date.getFullYear() !== year) { 
    date.setTime(Number.NaN); 
    return date; 
    } 
    return date; 
} 

$.validator.addMethod('date', function (value, element) { 
    var format = "dd/MM/yyyy"; 
    return this.optional(element) || globalDate(value, format).isValid(); 
} 

Если вы только когда-либо хотите проверить формат dd/MM/yyyy, то вы могли бы упростить функцию globalDate() только с помощью

var date = new Date(); 
date.setHours(0, 0, 0, 0); 
var components = value.split('/'); 
var day = components[0]; 
var month = components[1]; 
var year = components[2]; 
date.setFullYear(year); 
.... 

Редактировать

В дополнении к комментариям Op в отношении стороны сервера упущения проверки, культура сервера должна принимать строку даты в формате dd/MM/yyyy. В файле web.config.cs

<system.web> 
    <globalization culture="en-AU" uiCulture="en-AU"/> // adjust to your culture code 
    .... 
+0

удаляет сообщение об ошибке на стороне клиента, но дает мне сообщение об ошибке при моей проверке modestate на стороне сервера вроде этого «Значение« 26/06/2015 »недействительно для PurchaseDate.». – Athul

+0

мой модельный элемент выглядит следующим образом [DisplayFormat (DataFormatString = "{0: dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime PurchaseDate {get; задавать; } – Athul

+0

Обратите внимание, что атрибут '[DisplayFormat]' в вашем случае бессмыслен. Его единственное уважение при использовании '@ Html.DisplayFor()' или '@ Html.EditorFor()'. В 'TextBoxFor()' его игнорируется. Если вы получаете сторону сервера ошибок, потому что культура сервера не принимает дату в формате 'dd/MM/yyyy'. Вам нужно будет установить культуру в файле 'web.config.cs' - см. Мое редактирование на ответ –

2

Если вы хотите явно установить ожидаемый формат даты для вашей модели собственности, то вы можете сделать это с помощью DisplayAttribute

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

В противном случае, текущая культура сервера будет использоваться (в вашем случае происходит MM/dd/yyyy).


Оказывается, что для того, чтобы проверка на стороне клиента уважать DataFormatString мы должны использовать EditorFor вместо TextBoxFor

@Html.EditorFor(model => model.PurchaseDate, new { @class = "form-control date-picker" }) 
@Html.ValidationMessageFor(model => model.PurchaseDate) 
+0

Я пробовал это, но я все еще получая такое же сообщение – Athul

+0

@Athul какая ошибка вы получаете? Это клиентская или серверная сторона? – James

+0

То же, что я сказал в моем вопросе, нет никаких изменений в ошибке. Это клиентская сторона. – Athul

Смежные вопросы