web-dev-qa-db-ja.com

EditorFor()値をMVCビューで読み取り専用として表示しますか?

MVC5コードファーストアプリのほとんどのビューに表示するフィールドがいくつかあります:_[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_にする方法を提供できますか?

DetailsビューのようにDisplayFor()を試しましたが、レコードを保存しようとすると、_[created_date]_のEditorFor()の値が「-」から変更されます。 2015-02-18 "から" 01-01-01 "および_created_by_は、以前にnullに設定されていたシステムユーザー名から検証メッセージ「created_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; }
_
5

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を使用)、いつものように、ビューモデルを使用するのが最善のアプローチです(ビューモデルには「読み取り専用」の検証属性は含まれません)プロパティ)、投稿するときに、元のデータモデルを取得し、保存する前に関連するビューモデルのプロパティをデータモデルにマップします。

37
user3559349