2009-08-31 10 views
5

3つ以上のフォームのバージョンを表示しています。 1つのバージョンは、すべてのフィールドを編集する編集フォームです。第2のバージョンは同じフォームの読み取り専用バージョンであり、ユーザがデータを入力することができないように、すべてのフィールドがクライアント側でreadonly = "true"のすべてのフィールドを表示するために使用されます。 readonlyフィールドは異なるCSSスタイルを使用する必要があります。これは、アーカイブされたデータを表示するためです。私はすでに提出ボタンを隠していますので、提出することはできませんが、私はフォームが読んでいるように見えます。 3番目のバージョンでは、読み込み専用のフィールドと編集権限の限られた特定のクラスのユーザー用に編集可能なフィールドがあります。MVCですべてのフォームフィールドを読み取り専用にする

私はASP.NET MVC 1.0を使用しています。表示されるフィールドのすべて(または一部)を変更して読み取り専用にするにはどうすればよいですか。私はコントローラーのフィールドのコレクションを反復し、それらをすべて読み取り専用に設定し、正しいCSSクラスを設定したいと思います。私は.aspxファイルのすべてのフィールドにif文を入れる必要はありません(40-50個のフィールドがあります)、私はjavascript/htmlを変更できないようにクライアント側でこれを持たない方がいいです彼らが想定していないものを編集する。

TIA、

スティーブShier

+3

ただ、サイドノート:「私は、彼らがになっていないものを編集するためにはJavaScript/HTMLを変更するからユーザーを防ぐことができます」。ユーザーがPOSTデータを戻すことができないhtmlにロックするだけであると仮定しないでください。 POSTを偽装するのはとても簡単です。 – jeef3

+0

答えをありがとう。私はフォームの内容を部分的に見ています。フォームをフィールドのコレクションとして扱い、外部パラメータ(ユーザーの権利)に基づいて読み取り専用フィールドを選択したいと思います。私は、同じコレクションを再利用して、外部のパラメタに基づいて表示プロパティを設定する必要があります。私はユーザーが編集のための正しい権利を持っていることを確認するために、サーバー側でロジックを持っています。私はこれをすべてのサーバー側で行い、jqueryを使用したくないです。複数のパーシャルを使用する場合は、コードをコピー&ペーストし、DRY違反の保守上の問題があります。 ありがとう、 スティーブ –

答えて

12

あなたは、サーバー側で読み取り専用としてタグを設定した場合でも、ユーザーがはまだ様々な手段を介してそれらを変更し、どのような値できることに注意してくださいフォーム上のの前にが返されます。

は確かに最も簡単な方法は、jQueryを使って、クライアント側である:

$(function() { 
    $('input, select, textarea').attr('disabled', 'disabled'); 
}); 

それとも、あなたはあなたのビューでそれを行うことができますが、それは醜いです。私の頭の上から、boolのいくつかの種類がビューに渡される必要があります(ViewData経由)。にそれぞれの入力を入力して、disabled属性を追加する必要があるかどうかを確認します。面白いの私の考え...

+0

サーバー側で無効な属性をどのように追加しますか? –

+0

@Steve - @ Html.TextBoxFor(model => model.Property、new {disabled = "disabled"}) –

1

私はあなたの状態に応じてビューを選択し、次にあなたがいる状態に応じてビューを選択します。また、部分を分解し、さまざまな要素のセットの編集可能なバージョンまたは読み取り専用のバージョンを簡単に含めることができます。したがって、読み取り専用ビューにはフォーム要素を含める必要はありません。入力要素ではなく、スパン、div、または段落にデータを表示することもできます。

注:現在のユーザーがフォーム送信を処理するアクションでデータを更新/作成できるかどうかを確認する必要があります。読み取り専用形式でデータを表示する機能を制限するだけで、誰かがフォームの投稿を作成してアプリケーションを模倣するのを止めることはできません。悪意のあるユーザーがデータの入力や変更を行おうとするのを防ぐため、クライアント上のものを隠す/無効にすることはできません。

0

私は通常、フォームやフォームの一部を表すために部分ビューを使用します。

私はあなたが必要なものを行うには2つの簡単な方法(私はそれを理解できるように)と考えることができ

the_right_partialは、コントローラまたは(その場合には、the_right_partial(something))ヘルパーから渡された値のいずれかである

  1. <% Html.RenderPartial(the_right_partial, model); %> ;
  2. 編集可能性を表すコントローラからboolまたはenumパラメータを渡し、ヘルパーを使用して適切なhtmlAttributesを取得します。 <%= Html.TextBox("name", value, Html.TheRightHtmlAttributesFor(isReadableOrNot)) %>;

、または中のhtml/aspxのをマングリングのような追加のisReadableOrNotの引数を受け入れる入力フィールドの新しいヘルパーを作成するような他の方法、(それは私にはやり過ぎだ)があるかもしれないいくつかの奇妙な(とは全く読めません/維持できない方法)、私はそれらを提案していない。 HTMLを使用してdisabledなどの属性という

お知らせクライアント側で、放火犯のようなツールで、それはそれらを変更するためにわずか2秒かかります。

他の人は既に言っていますが、私は次のこともしなければなりません:常にユーザーは最悪の可能なことをするために最善を尽くすと仮定します。したがって、サーバー側のものを変更するユーザー権利を確認し、 (この場合は、フォームが編集されていないと理解させるために)ユーザーに礼儀としてサイドチェックを行います。

0

私はフォームのさまざまな状態に単一の部分を使用しようとしているので、状態とユーザーに基づいて正しく表示されるヘルパー関数を作成すると考えています。ヘルパーは、フィールドの読み込み専用の条件を示すフィールドの辞書を使用します。私はまだデータが有効で、ユーザーが変更を許可されていることを確認するためにサーバー側のチェックを行います。

ご協力いただきありがとうございます。

スティーブ

関連する問題