Показывать значение 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), поэтому, как всегда, использование модели представления является лучшим подходом (модель представления не будет включать в себя атрибуты проверки для "только для чтения"). свойства), а затем при публикации получить исходную модель данных и сопоставить соответствующие свойства модели представления с моделью данных перед сохранением.

Другие вопросы по тегам