2011-12-15 13 views
4

2つのMVCビューがあります.1つは詳細を表示するため、もう1つは値を編集するためです。エディタビューに切り替えるときに、DisplayForがEditorForに変更されている点を除いて、ほとんど同じテンプレートを使用します。基本レイアウトを変更する必要がある場合は、複数のビューではなく1つの場所でのみ行う必要があるため、ビューでベースレイアウト構造を再利用するにはどうすればよいですか?ここでデータの表示とデータの編集の両方でMVCビューを再利用

が表示画面で使用されるテーブルのサンプルです:

<table> 
    <tr> 
    <td class="label">First Name:</td> 
    <td class="field">@Html.DisplayFor(x => Model.FirstName)</td> 
    </tr> 
    <tr> 
    <td class="label">Last Name:</td> 
    <td class="field">@Html.DisplayFor(x => Model.LastName)</td> 
    </tr> 
    <tr> 
    <td class="label">Email:</td> 
    <td class="field">@Html.DisplayFor(x => Model.Email)</td> 
    </tr> 
</table> 
+0

MVCのビューテンプレートの使用を検討してください。そうすれば、すべてのオブジェクト・エディタを扱うための単一のビューと、オブジェクト・タイプごとに1つのビューを使用するだけでなく、コード・リユースを行うすべてのオブジェクト・ディスプレイャを処理する別のビューを持つことができます。 – StriplingWarrior

答えて

3

あなたはあなたのビューモデルにModeプロパティを追加することができます。そして、

public bool IsInEditMode { get; set; } 

、あなたのコントローラは、同じビューを使用することができます&モデルで、このプロパティを設定するだけです。あなたのビューは次のように終わるでしょう:

<table> 
    <tr> 
    <td class="label">First Name:</td> 
    <td class="field"> 
     @if (!Model.IsInEditMode) 
     { 
      @Html.DisplayFor(x => Model.FirstName) 
     } 
     else 
     { 
      (render EditorFor plus any validation helpers) 
     } 
    </td> 
    </tr> 
    ...etc... 
</table> 
+0

私は何かクリーナー(1ライナーや何らかのラッパーメソッド)を望んでいましたが、うまくいきます。情報をありがとう! – bigmac

1

それとも

public bool IsInEditMode { get; set; } 

@helper EditorFor(System.Linq.Expressions.Expression<Func<ViewModel, string>> exp) 
{ 
    @((Model.IsInEditMode) ? @Html.EditorFor(exp) : @Html.DisplayFor(exp)) 
} 
+0

これは別の状況にも役立ちました。私はビューと編集を結合していませんが、私の編集ビューは状態に基づいて多くの制約を持っています(状況によってはいくつかのフィールドが編集できないかもしれません)。 – Peter

0

はあなたのエンティティのIDをチェックし、ダイナミックビューを持つカミソリヘルパーのように、この仕事のためにきれいなものを使用することができます。かみそりは素晴らしいです! 0またはnullの場合は新しいエンティティ、そうでない場合は編集モードです。

面皰!

関連する問題