web-dev-qa-db-ja.com

ASP.NET MVC3 Razorで読み取り専用のテキストボックスを作成する方法

Razorビューエンジンを使用してASP.NET MVC3で読み取り専用のテキストボックスを作成する方法それを行うために利用可能なHTMLHelperメソッドはありますか?

このようなもの?

@Html.ReadOnlyTextBoxFor(m => m.userCode)

107
Shyju
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

このためにHTMLヘルパーを作成することはできますが、これは他のようなHTML属性にすぎません。他の属性を持つテキストボックスのHTMLヘルパーを作成しますか?

227
user596075

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を作成します

  1. ~/Views/Shared/EditorTemplatesという名前のフォルダーを作成します
  2. String.cshtmlという名前のカミソリPartialViewを作成します
  3. 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" }) 
    }
    
  4. モデルクラスで、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" />

このソリューションは、あらゆるタイプのデータ(DateTimeDateTimeOffsetDataType.TextDataType.MultilineTextなど)に使用できます。 editor-templateを作成するだけです。

29
javad amiry

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>

一般的に、このソリューションは編集に対するファイリングを無効にしますが、その価値を示します。コードビハインドの変更は必要ありません。

5
Bronek

@Bronekと@Shimmyによる前回の回答に対するクレジット付き

これはASP.NET Coreで同じことをした

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

最初の入力は読み取り専用で、2番目の入力は値をControllerに渡して非表示になります。ASP.NetCoreで作業している人にとっては便利です。

1
Adithya Baddula

以下のコードを使用して、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"}})
0
 @Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
0
Hossein Dahr
@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フィールドに対してのみ機能します。

0
gdmanandamohon