Razorビューエンジンを使用してASP.NET MVC3で読み取り専用のテキストボックスを作成する方法それを行うために利用可能なHTMLHelperメソッドはありますか?
このようなもの?
@Html.ReadOnlyTextBoxFor(m => m.userCode)
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
このためにHTMLヘルパーを作成することはできますが、これは他のようなHTML属性にすぎません。他の属性を持つテキストボックスのHTMLヘルパーを作成しますか?
PDATE: html属性をデフォルトのエディターテンプレートに追加するのは非常に簡単です。これを行う代わりに:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
あなたは単にこれを行うことができます:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
利点:テンプレートに対して.TextBoxFor
などを呼び出す必要はありません。 .EditorFor
を呼び出すだけです。
@Sharkのソリューションは正しく機能し、シンプルで便利ですが、私のソリューション(私はいつも使用しています)はこれですreadonly
属性を処理できるeditor-template
を作成します:
~/Views/Shared/
にEditorTemplates
という名前のフォルダーを作成しますString.cshtml
という名前のカミソリPartialView
を作成します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
にするプロパティに[ReadOnly(true)]
属性を設定します。
例えば.
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
かみそりのデフォルトの構文を簡単に使用できます:
@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のようなスタイリッシュなフィールドを見たくない場合(ユーザーにとっては少し混乱するかもしれません)は、次のような変更を伴います。
1。変更前のカミソリコード
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
2。変更後
<!-- 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番目の入力は値をControllerに渡して非表示になります。ASP.NetCoreで作業している人にとっては便利です。
以下のコードを使用して、TextBoxを読み取り専用として作成できます。
方法-1
@Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })
方法-2
@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
@Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
これは、テキストボックスでは問題ありません。ただし、checkbox
に対して同じことをしようとする場合は、使用する場合はこれを使用してみてください
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
ただし、disable
を使用しないでください。無効にすると、デフォルト値falseが常にチェック済みまたは未チェック状態のサーバーに送信されます。また、readonly
は、チェックボックスとradio button
では機能しません。 readonly
は、text
フィールドに対してのみ機能します。