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


118

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

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

次のようなものですか?

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

回答:


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

このためのHTMLヘルパーを作成することはできますが、これは他のHTMLの属性と同じです。他の属性を持つテキストボックス用のHTMLヘルパーを作成しますか?


1
@Shyju申し訳ありません@が、readonlyプロパティのプレフィックスがありませんでした。私の編集を参照してください。

7
将来、動的オブジェクト引数にプロパティを追加するときに何らかのエラーが発生した場合は、プロパティの前にを付けることができます@。通常は、HTML属性(readonly、classなど)に一致するキーワードでのみ表示されます
Brad Christie

10
@BradChristie:いいえ。C#キーワードに@一致する属性を使用する必要があるだけです。
12

1
@BradChristie:私はあなたのコメントを読み間違えました( "keywords"があいまいでした)
SLaks

1
:複数のHTML属性を持っている場合は、あなたのような何かを行うことができます@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
benscabbia

32

更新: HTML属性をデフォルトのエディターテンプレートに追加するのが非常に簡単になりました。これを行う代わりに、それは無効になります:

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

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

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

メリット:.TextBoxForテンプレートについては、などを呼び出す必要がありません。電話するだけ.EditorFor


@Sharkのソリューションは正しく機能し、シンプルで便利ですが、私のソリューション(私が常に使用している)はこれです属性を処理できるを作成します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.TextDataType.MultilineTextなど)。だけを作成しeditor-templateます。


2
「ViewData.ModelMetadata.IsReadOnly」を使用したため、+ 1。私はMVCがバージョン4でこれらのものを考慮に入れると期待していました
cleftheris

@cleftherisはバージョン5になりましたが、MVCはまだそれらを使用していませんでした;)
レイビーアミリー2014

2
@Javad_Amiry-すばらしい答え-私はそれを実装しましたが、Scaffolded EditページでSaveをクリックするまではうまくいったようです。次に、[ReadOnly(true)]を含むプロパティは、実際のプロパティ値の代わりにNULLがデータベースに送信されることがわかります-これに遭遇しましたか?
パーシー

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>

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


1
ここに、editor-fieldクラスとdisplay-fieldクラスのCSSがあると本当に役立つと思います。
2014年

「このソリューションでは、ファイルを編集できないようにするとはどういう意味ですか(理解できないようです)?ここではコメント(適切なものではありません)ではなく、回答を編集して返信してください。
Peter Mortensen

3

@Bronekと@Shimmyによる以前の回答のクレジットを使用して:

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

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

最初の入力は読み取り専用で、2番目の入力は値をコントローラーに渡し、非表示になります。ASP.NET Coreを使用している人に役立つと思います。



0
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

これはテキストボックスには問題ありません。ただし、同じことをしようとする場合、checkboxそれを使用している場合はこれを使用してみてください。

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

ただしdisable、を使用しないでください。disableは常にデフォルト値falseをサーバーに送信するため、チェックされた状態またはチェックされていない状態のどちらかでした。また、readonlyチェックボックスとでは機能しませんradio button。フィールドでreadonlyのみ機能しtextます。


ドロップダウンリストはどうですか?
user3020047


0

以下のコードを使用して、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"}})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.