2012-04-12 13 views
0

私はasp.net mvc3 C#アプリケーションを持っています。それはデータベースを使用します。データベースは、要件のためにソフト削除シナリオをサポートしています。ソフト削除シナリオはカスケードしません。削除されたと記録されたレコードはグレー表示されます。私の問題は、htmlのマークアップとスタイルを使ってモデルから各ディスプレイを囲む必要がなくてもこれを行う方法です。例えば@Modelのアイテムをより効率的に装飾する方法を教えてください。

<span @if(m.Box.isDeleted){ 
<text>style="background-color:gray"</text> 
}>@m.Box.Name @m.Box.Description</span> 

私はそれを行うが、私は、文字通りすべてのViewModelにオブジェクト表示にしなければならないすべての余分なマークアップで見ることができます。

私がしたいのは、@ m.Box.Name.AddMarkup()かその程度です。おそらく、私はアイテムを取った後、私はこれにアプローチする方法を確認していない、またはいずれかのが示唆されている場合、このような

namespace place.Markup 
public class Markup 
{ 
public ModelItem(object o, property name) 
{ 
    //perhaps use reflection so the flag isnt passed all the time 
    //create markup with flag conditional decoration 
    //return markup 
} 
} 

、その後

@Markup.ModelItem(@m.Box.Description) 

として正しいマークアップを返されたヘルパーを作ることができます方法は他人がこの問題にどのように近づいているかです。あなたはソフト削除されたアイテムを表示しようとしましたか?これについては良いチュートリアルがありますか?私は本当にこのテーマについて多くの資料を見つけることができませんでした。

注:これらのオブジェクトのフィルタリングは問題ではなく、意図的に表示され、ソフト削除を反映するように表示する必要があります。

+0

を。 –

+0

@KirkWoll - 申し訳ありませんが、十分に明示されていません。 **効率的にその値に基づいてviewmodelオブジェクトにビュー内のマークアップを追加する方法はありますか?** –

答えて

2

私は

public static MvcHtmlString DisplayDeleteCheckFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression, bool condition) { 

    var value = html.DisplayFor(expression).ToString(); 
    var style=condition ? "style=\"background-color:gray\"" : string.Empty; 

    return MvcHtmlString.Create(
     string.Format("<span {0}>{1}</span>", style, value)); 
} 
1

ようDisplayFor

何かそれを行うための簡単な方法の一つまたは多くの過負荷に基づいてのHtmlHelperになるだろう、CSSを利用することです。これは本当に大まかな例です。あなたのビューで

if (m.Box.isDeleted) 
{ 
    m.Box.listOfClasses.Add("isDeleted"); 
} 

<div class="@string.Join(" " , m.Box.listOfClasses)"> 
    <span>blah</span><br/> 
    <span class="showGrayIfDeleted">This will be gray if deleted.</span><br/> 
    <span class="showGrayIfDeleted">@m.Box.Name @m.Box.Description</span><br/> 
</div> 

あなたが唯一のコンテナHTMLに単一のクラスを適用する必要がCSSの影響カスケーディングを利用することで、あなたのコントローラーで

<style> 
.isDeleted .showGrayIfDeleted 
{ 
    background-color:gray; 
} 
</style> 

すべての内部要素が異なる背景を持つようにします。

<table> 
    <thead> 
     <tr> 
      <td>Date</td> 
      <td>Name</td> 
      <td>Is Deleted</td> 
      <td>Active</td> 
     </tr> 
    </thead> 
     <tr> 
      <td>Today</td> 
      <td>Bottle</td> 
      <td class="@(ProductCssHelper.IsDeleted(Model.IsDeleted))">Yes</td> 
      <td class="@(ProductCssHelper.IsActive(Model.IsActiveAction))">No</td> 
     </tr> 
</table> 

CSSの定義が含まれていないが、この意志:かみそりで

public static class ProductCssHelper 
{ 
    public static string IsDeleted(bool IsDeleted) 
    { 
     return IsDeleted ? "deleted" : String.Empty 
    } 

    public static string IsAction(bool IsActiveAction) 
    { 
     return IsAction ? "active-action" : "inactive-action" 
    } 
} 

:私はこのために何をやったか

1

はCSS静的ヘルパーので、同じように構成されているクラスを持つことです定義されたcssクラスの文字列を返します。

私はCSSHelperフォルダを作成することができますし、コントローラやビュー/エリアで分割する必要があるヘルパークラスを数多く持っているので、すべてを1か所に収めることができます。

ないもともと私の考えが、私はこのアイデアを得たソースが見つかりました:私はあなたの質問が何であるかを理解していない http://www.arrangeactassert.com/asp-net-mvc-view-best-practices-keep-logic-out-of-your-views/

関連する問題