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