2012-01-11 15 views
0

データを収集する必要があり、保存されたデータを表示して編集を許可する必要がある部分的なビューがあります。子要素の表示方法にプロパティが影響する可能性がある包含要素の作成

フォーマットが複雑なので、両方のニーズに同じ部分表示を使用したいと思います。しかし、私は特定のコントロールに「無効」タグを適用するだけではありません。(サーバー側で)読み取り専用のデータをコントロールとしてではなくテキストとしてレンダリングして、ポストバックすることはできません。

(物事を複雑にしているのは、一つのフィールドがあり、コメントのために、それは他のすべてのフィールドが読み取り専用されている場合でも編集することができますので、バックポストがあるでしょう。)

私は考えていますこの問題に対する一般的な解決策です。最も簡単な方法は、すべてのフィールドに次のコードパターンを適用するには、次のようになります。

@{ if(condition) { 
    @Html.TextBoxFor(model=>model.Field) 
} 
else 
{ 
    @Html.DisplayFor(model=>model.Field) 
} 
} 

しかし、それは洗練さだとコードを読み取ることが困難になることができます。また、パターンを手動で適用する必要があるため、間違いを起こしやすい。

私はTextBoxForを呼び出すか、DisplayForを呼び出すかを示す追加のパラメータを取るTextBoxForを補う拡張メソッドを書いていました。

でも、私がもっと良くしたいのは、子要素のレンダリングに自動的に影響を及ぼす要素を含むエレメントに設定できるものです。つまり、ASP.NET WebForms PanelコントロールでVisibleプロパティを設定できる方法です。

ここで私は仮説の分野に踏み込んでいます。このようなことを実現するためには、独自のスコープを認識し、それが含まれているレンダリング拡張機能がどのように呼び出されるかに影響を与える、サーバー側の要素(おそらくBeginFormと同じパターンに従う)が必要です。

このようなことも可能ですか?

+3

なぜ2つの別々のビューを作成してみませんか? –

+0

@Sharkビューは十分に複雑で、十分に複雑な書式があるため、同期して維持する必要のある2つのものを作成したくないためです。しかし、ありがとうございます:一般的にはおそらく最も良い解決策です。 –

答えて

0

私はこの記事を見てしまう:http://kazimanzurrashid.com/posts/asp-dot-net-mvc-viewmodel-usage-and-pick-your-best-pattern

それはビューからロジック、手続き型コードを削除して、よりよいOOPとカプセル化を促進するアプローチを採用しています。少なくとも有益な情報があれば役に立つかもしれません。

+0

それはとても面白いです!ありがとうございました! –

+0

問題ありません。うれしいことです:) – Paul

0

私はこれを推薦本当にないんだけど、あなたははこのような何か行うことができます:

public static MvcHtmlString Ternary<TModel, TValue>(this HtmlHelper<TModel> html, bool test, Expression<Func<TModel, TValue>> expression, Func<Expression<Func<TModel, TValue>>, MvcHtmlString> truthy, Func<Expression<Func<TModel, TValue>>, MvcHtmlString> falsey) 
    { 
     return ((test) ? truthy : falsey).Invoke(expression); 
    } 

をし、このようにそれを使用します。シャークのような

@Html.Ternary(condition, x => x.Field, Html.TextBoxFor, Html.DisplayFor)); 

別のビュー、は、実際にはおそらく正しい方法です。

+0

ありがとう!それは面白いアプローチです! (しかし、私は別々の意見がより合理的であることに同意します。私はポールの反応を以下に非常に興味深いと感じました。) –

関連する問題