2011-06-21 15 views
0

私のコントローラのMVCには、自分のモデル([コード]、[Libelle]、[IsActif]の3つのフィールドを持つジェネリックモデル)を表示するアクションがあります。モデルに動的ReadOnly属性を追加する

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
[ActionName("AfficheDetailMotifRejet")] 
[AuthorizeRoleFilter(Roles = TypeRoles.Roles.ADMINISTRATEUR_NATIONAL)] 
public ActionResult AfficheDetailMotifRejet([DefaultValue(Int64.MinValue)] Int64 id) 
{ 
    DetailGeneric dg = new DetailGeneric { Id = id }; 

    if (id > 0) 
    { 
     MotifRejet s = _srvMotifRejet.Charger(id); 
     Mapper.CreateMap<MotifRejet, DetailGeneric>(); 
     dg = Mapper.Map<MotifRejet, DetailGeneric>(s); 
    }    

    return View("GererMotifRejet", dg); 
} 

私はIDとしてInt64.MinValueを送信する場合は、その後、私のモデルを挿入する準備ができて、空を示しています。 しかし、私が既存のIdで編集することを示すとき、私はReadOnlyモードで[コード]フィールドを作成する必要があります。

最適なソリューションは何ですか?

dg.Codeの[ReadOnly(true)]属性を追加すると思いますが、これを作成する方法はありますか?

しかし、私はこれをJavaScriptで作成することができますが、ユーザーがJavaScriptを有効にしていないと、リスクがあります。

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

+2

属性はコードとともにコンパイルされ、dll自体に格納される定数です。つまり、実行時にコードを生成してコンパイルしない限り、実行時に属性の値を技術的に '変更'できません。おそらく、属性に焦点を当てずに同じことを達成するための別の方法を探してみたいでしょう。 –

答えて

2

実行時に属性を設定することはできません(「コード」など)。

あなたの最善の策は、2つのうちの1を行い、その後、編集をラップビューモデルを作成し、モードを作成するには、次のようになります。

1)@if (Model.IsEditMode)チェックを行い、そして@Html.EditorFor trueの場合、または@Html.DisplayForのいずれかをレンダリングfalseの場合

2)モデルに関連付けられたHTMLヘルパーを作成します。このヘルパーはモデルデータを検査し、同じ値に基づいて上記のヘルパーのいずれかを呼び出します。

いずれにせよ、それに応じて意思決定を行う場合は、作成ビューと編集ビューのための何らかの「ベース」ビューモデルが必要です。

+0

ありがとうございます。私は最初のソリューションを使用しており、うまくいきます。 –

0

custom metadata providerを使用して実行時にモデルメタデータを提供することは可能ですが、この問題に取り組むには間違った解決策があります。

エンティティが編集可能で、編集関連のものをクライアント側でレンダリングしないようにするには、http投稿の後にモデルを作成してください。

関連する問題