127

Razor ビュー エンジンを使用して ASP.NET MVC3 で読み取り専用テキスト ボックスを作成するにはどうすればよいですか?

それを行うために利用できる HTMLHelper メソッドはありますか?

以下のようなものですか?

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

7 に答える 7

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

このための HTML ヘルパーを作成することは大歓迎ですが、これは他の属性と同様に単なる HTML 属性です。他の属性を持つテキスト ボックスの HTML ヘルパーを作成しますか?

于 2012-01-06T17:15:18.960 に答える
34

更新: HTML 属性をデフォルトのエディター テンプレートに簡単に追加できるようになりました。これを行う代わりに、次のことを行います。

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

あなたは単にこれを行うことができます:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

.TextBoxFor利点:テンプレートのために などを呼び出す必要はありません。電話するだけ.EditorForです。


@Sharkのソリューションは正しく機能し、シンプルで便利ですが、私のソリューション(私が常に使用する)は次のとおりです。属性を処理できるan を作成しeditor-templatereadonlyます。

  1. EditorTemplatesという名前のフォルダーを作成します~/Views/Shared/
  2. PartialViewという名前のかみそりを作成しますString.cshtml
  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(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" />

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

于 2012-07-28T16:17:16.197 に答える
5

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>
    

通常、このソリューションはフィールドの編集を防ぎますが、その価値を示します。コード ビハインドの変更は必要ありません。

于 2012-11-27T15:37:21.690 に答える
3

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

これは、ASP.NET Core で同じことを行ったようなものです。

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

最初の入力は読み取り専用で、2 番目の入力は値をコントローラーに渡し、非表示になります。ASP.NET Core を使用している方の参考になれば幸いです。

于 2016-06-08T08:07:06.563 に答える
0
 @Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
于 2016-09-28T12:55:40.927 に答える