0

asp.net mvc3 C# アプリケーションがあります。データベースを使用しています。データベースは、要件により論理的な削除シナリオをサポートしています。論理的な削除のシナリオはカスケードしません。削除済みのフラグが付けられたレコードはグレー表示されます。私の問題は、モデルの各ディスプレイを常にいくつかの html マークアップとスタイルで囲む必要なく、これを行う方法にあります。

例えば:

<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)

これにどのようにアプローチすべきか、または提案された方法のいずれかが他の人がこの問題にアプローチした方法であるかどうかはわかりません。ソフト削除されたアイテムを表示するために何を試みましたか? これに関する適切なチュートリアルはどこかにありますか? このテーマに関する資料はあまり見つかりませんでした。

注意: これらのオブジェクトのフィルタリングは問題ではありません。これらは意図的に表示されており、論理的な削除を反映する方法で表示する必要があります。

4

3 に答える 3

2

DisplayForの1つまたは複数のオーバーロードに基づいてhtmlHelperを作成します

何かのようなもの

 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));
}
于 2012-04-12T19:28:09.800 に答える
1

それを行う最も簡単な方法は、CSS を利用することです。これは非常に大雑把な例です。

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

コントローラーで:

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>

CSS のカスケード効果を利用することで、単一のクラスをコンテナー html 要素に適用するだけで、すべての内部要素に異なる背景を持たせることができます。

于 2012-04-12T19:29:32.330 に答える
1

このために私が行ったことは、次のように構造化された 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"
    }
}

かみそりで:

<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 定義は含まれていませんが、これにより、定義された CSS クラスの文字列が返されます。

CSSHelper フォルダーを作成し、その中に必要な数のヘルパー クラスをコントローラーまたはビュー/エリアごとに分割して、すべてを 1 か所にまとめることができるため、この方法が気に入っています。

もともと私のアイデアではありませんが、このアイデアを得たソースを見つけました: http://www.arrangeactassert.com/asp-net-mvc-view-best-practices-keep-logic-out-of-your-views/

于 2014-02-25T06:02:55.493 に答える