Показывать значение EditorFor() как доступное только для чтения в MVC View?
У меня есть несколько полей, которые отображаются в большинстве моих представлений в приложении MVC5 Code-First: [created_date]
, [created_by]
, [modified_date]
, а также [modified_by]
, Для пользователя, я хотел бы включить их также на моем Edit()
просмотр, но в отличие от других моих полей, я не хочу, чтобы они были редактируемыми (обычно создаваемые / изменяемые / изменяемые / данные не должны редактироваться).
Вот как у меня есть поля, объявленные на моем Edit()
посмотреть в настоящее время:
<div class="form-group">
@*@Html.LabelFor(model => model.created_date, htmlAttributes: new { @class = "control-label col-md-2" })*@
<span class="control-label col-md-2">Created Date:</span>
<div class="col-md-10">
@Html.DisplayFor(model => model.created_date, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.created_date, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@*@Html.LabelFor(model => model.created_by, htmlAttributes: new { @class = "control-label col-md-2" })*@
<span class="control-label col-md-2">By:</span>
<div class="col-md-10">
@Html.DisplayFor(model => model.created_by, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.created_by, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@*@Html.LabelFor(model => model.modified_date, htmlAttributes: new { @class = "control-label col-md-2" })*@
<span class="control-label col-md-2">Modified Date:</span>
<div class="col-md-10">
@Html.DisplayFor(model => model.modified_date, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.modified_date, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@*@Html.LabelFor(model => model.modified_by, htmlAttributes: new { @class = "control-label col-md-2" })*@
<span class="control-label col-md-2">By:</span>
<div class="col-md-10">
@Html.DisplayFor(model => model.modified_by, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.modified_by, "", new { @class = "text-danger" })
</div>
</div>
Может кто-нибудь предложить способ сделать эти поля read-only
?
Я старался DisplayFor()
как на моем Details
Просмотр, но когда я иду, чтобы сохранить запись, значение в моем EditorFor()
за [created_date]
изменяется с "2015-02-18" на "0001-01-01" и created_by
изменяется от моего имени пользователя системы, как ранее было установлено null
с сообщением о проверке "Поле made_by обязательно." Я считаю, что это как-то связано с моими аннотациями моделей для полей, но я не понимаю, почему DisplayFor()
не передает значение через мой контроллер, как, как EditorFor()
делает...?
Модельные аннотации:
[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime created_date { get; set; }
[Required]
public string created_by { get; set; }
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? modified_date { get; set; }
public string modified_by { get; set; }
1 ответ
DisplayFor()
не генерирует элемент управления, который отправляет обратно. Вы должны включить скрытый ввод в дополнение к отображаемому тексту, например
<div class="form-group">
<span class="control-label col-md-2">@Html.DisplayNameFor(m => created_by)</span>
<div class="col-md-10">
@Html.DisplayFor(model => model.created_by
@Html.HiddenFor(m => created_by)
</div>
</div>
Другой вариант - сделать текстовое поле доступным только для чтения.
<div class="form-group">
@Html.LabelFor(model => model.created_by, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.created_by, new { @class = "form-control", @readonly = "readonly" })
</div>
</div>
Обратите внимание, что нет смысла добавлять @Html.ValidationMessageFor()
Примечание: ничто не мешает пользователю изменять значения скрытого ввода (например, с помощью FireBug), поэтому, как всегда, использование модели представления является лучшим подходом (модель представления не будет включать в себя атрибуты проверки для "только для чтения"). свойства), а затем при публикации получить исходную модель данных и сопоставить соответствующие свойства модели представления с моделью данных перед сохранением.