2016-09-24 3 views
0

В моем редактировать VIEW У меня есть следующий код:MVC поля формы проблема проверки

<div class="form-group"> 
    @Html.LabelFor(model => model.CREATED, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(model => model.CREATED, new { htmlAttributes = new { @class = "form-control", @readonly = true } }) 
     @Html.ValidationMessageFor(model => model.CREATED, "", new { @class = "text-danger"}) 
    </div> 
</div> 

Как вы можете видеть Created текстовое поле только для чтения и неактивна.

Validation fires wrongly

В моем MODEL У меня есть следующий:

public Nullable<System.DateTime> CREATED { get; set; } 

Проблема в том, когда вы поместите курсор в неактивна поля, а затем перейти в другое поле, пожары проверки ошибочно.

Как обойти эту проблему?

+0

Если он не может быть отредактирован, то почему вы создаете для него элемент управления формой? И ошибка возникает из-за того, что 'jquery.validate.js' проверяет даты на основе формата' MM/dd/yyyy', и ваша культура выглядит 'dd/MM/yyyy' –

+0

Так как имя свойства указывает его дату, запись была создана, она не должна быть в представлении в любом случае - она ​​должна быть установлена ​​только в контроллере непосредственно перед сохранением модели данных (и в вашем представлении должна использоваться [модель просмотра] (http://stackoverflow.com/questions/ 11064316/what-is-viewmodel-in-mvc) без свойства 'CREATED'. –

+0

Я хочу показать, когда он был создан. Я столкнулся бы с этой проблемой, если бы создал это значение в' div'? – PriceCheaperton

ответ

1

Причина ошибки проверки на стороне клиента, что вы сгенерировали текстовое поле для свойства и по умолчанию, jquery.validate.js проверяет даты на основе формата MM/dd/yyyy, в то время как ваш формат dd/MM/yyyy. Вы можете переопределить $.validator, как описано в ответе на ваш subsequent question.

Однако реальная проблема заключается в том, что вы не должны создавать элемент управления формы для свойства «Создать дату» (или «Измененная дата»). Эти значения должны устанавливаться только в методе POST контроллеров непосредственно перед сохранением объекта.

В представлении, если редактирование существующего объекта, используйте

<div>@Html.DisplayFor(m => m.CREATED)</div> 

для отображения даты, и вы можете форматировать DIV, чтобы посмотреть, как ваши другие текстовые поля, если это необходимо. Вы должны также удалить связанный ValidationMessageFor() и LabelFor() (вы больше не имеет соответствующего контроля формы так <label> элемент не подходит - вы можете просто использовать (скажем) <span>@Html.DisplayNameFor(m => m.CREATED)</span>)

Если вы хотите, чтобы представить значение из CREATED, то вы можете также включить скрытый вход для значения (по умолчанию, скрытые входы не подтверждены)

@Html.HiddenFor(m => m.CREATED) // you can use a [DisplayAttribute] for formatting the value 

Однако, поскольку вы редактируете данные, вы должны использовать view model, не ваша модель данных. В методе POST вы получаете исходную модель данных из репозитория на основе своего идентификатора и обновляете свои свойства на основе значений из модели представления (что делает необходимость скрытого ввода избыточным, поскольку вам не нужно обновлять это значение) , Этот шаблон также защищает вас от злонамеренных пользователей, которые могут изменить запрос и отправить обратно измененные значения для дат.