Razor ビュー エンジンを使用して ASP.NET MVC3 で読み取り専用テキスト ボックスを作成するにはどうすればよいですか?
それを行うために利用できる HTMLHelper メソッドはありますか?
以下のようなものですか?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
Razor ビュー エンジンを使用して ASP.NET MVC3 で読み取り専用テキスト ボックスを作成するにはどうすればよいですか?
それを行うために利用できる HTMLHelper メソッドはありますか?
以下のようなものですか?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
このための HTML ヘルパーを作成することは大歓迎ですが、これは他の属性と同様に単なる HTML 属性です。他の属性を持つテキスト ボックスの HTML ヘルパーを作成しますか?
更新: HTML 属性をデフォルトのエディター テンプレートに簡単に追加できるようになりました。これを行う代わりに、次のことを行います。
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
あなたは単にこれを行うことができます:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
.TextBoxFor
利点:テンプレートのために などを呼び出す必要はありません。電話するだけ.EditorFor
です。
@Sharkのソリューションは正しく機能し、シンプルで便利ですが、私のソリューション(私が常に使用する)は次のとおりです。属性を処理できるan を作成しeditor-template
readonly
ます。
EditorTemplates
という名前のフォルダーを作成します~/Views/Shared/
PartialView
という名前のかみそりを作成しますString.cshtml
に次のコードを入力String.cshtml
します。
@if(ViewData.ModelMetadata.IsReadOnly) {
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
} else {
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { @class = "text-box single-line" })
}
モデルクラスでは、[ReadOnly(true)]
あなたがしたいプロパティに属性を置きますreadonly
。
例えば、
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
これで、Razor の既定の構文を簡単に使用できます。
@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
text-box
最初のものは、次のような法線をレンダリングします。
<input class="text-box single-line" id="field-id" name="field-name" />
そして2番目はにレンダリングされます。
<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
このソリューションは、あらゆる種類のデータ ( DateTime
、DateTimeOffset
、DataType.Text
などDataType.MultilineText
) に使用できます。を作成するだけeditor-template
です。
TextBoxFor を使用した解決策は問題ありませんが、EditBox のようなスタイリッシュなフィールドを見たくない場合(ユーザーにとっては少し混乱するかもしれません) は、次のように変更する必要があります。
変更前のレーザーコード
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
変更後
<!-- New div display-field (after div editor-label) -->
<div class="display-field">
@Html.DisplayFor(model => model.Text)
</div>
<div class="editor-field">
<!-- change to HiddenFor in existing div editor-field -->
@Html.HiddenFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
通常、このソリューションはフィールドの編集を防ぎますが、その価値を示します。コード ビハインドの変更は必要ありません。
@Bronek と @Shimmy による以前の回答のクレジット付き:
これは、ASP.NET Core で同じことを行ったようなものです。
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
最初の入力は読み取り専用で、2 番目の入力は値をコントローラーに渡し、非表示になります。ASP.NET Core を使用している方の参考になれば幸いです。
@Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })