1

私は、MS Sql サーバー 2008 Express rc2 を使用して asp.net mvc3 Web アプリケーションに取り組んでいます。私のアプリでは、DB に 2 つの異なるブランドがあり、そのうちの 1 つは Null または「不明」の値がほとんどありません (たとえば、Null の代わりに「不明」が DB に追加されます)。私の質問は、View で If/Else ステートメントを使用する代わりに、null 以外の値のみを View Engine に渡す方法です。

コントローラーで:

var model = _data.GetViewModel(query);
        if (model != null)
        {                
            return View(model);
        }
        else
            return View("Error");

ビューモデルで;

    public int Id { get; set; }
    public string Query { get; set; }
    public string Brand { get; set; }
    public string Family { get; set; }
    public string Type { get; set; }

モデル:

    public ViewModel GetViewModel(string query)
    {
        var data = _comp.Get(p => p.Query == query);
        if (data == null) return null;
        return new ViewModel
        {
            Id = data.id,
            Brand = data.brand,
            Family = data.family,
            Type = data.type
        };
   }

ビューで(現在Ifステートメントを使用しています):

@if (Model.Brand != null)
{
<span class="brand">@Model.Brand</span> 
}

@if (Model.Family != null)
{
<span class="family">@Model.Family</span> 
}

@if (Model.Type != null)
{
<span class="type">@Model.Type</span>
}

注: 各ブランドのデータベースにはあまりにも多くの値があり、それらの多くが Null であるため、If ステートメントを避けたいので、それらの Null 値に対して Html を生成したくありません。上記のコードのような If/Else ステートメントを使用しています。If を使用して View でチェックする値が多すぎるため、サーバーとプロセッサのメモリが消費され、サーバーの応答時間も遅くなります。

これを行うための代替方法が必要です。部分ビューまたはその他のものを使用する必要がありますか? これを解決するために私を助けてください、あなたの助けは非常に高く評価されています. ありがとうございます。

4

2 に答える 2

3

まず、いくつかの背景/コンテキスト、次に私の提案です。

(ちなみに、これはすべて、ASP.NET MVC または ASP.NET NancyFX のすべてのバージョンに適用されます (そうです、別のオプションがあります!!)、など)

文脈/背景

これを解決するために、人々は一般的に次の 2 種類のカテゴリに分類されます。

  1. データを取得して、表示するものをビューに決定させます(IMOの適切な方法ではなく、一般的なものです)。
  2. はすべての面倒な作業を処理し、ビューに正確なController答えを与える必要があります (適切な方法、IMO)。

最初の方法は、迅速かつ汚いです。確かに機能しますが、ビューにロジックが入りすぎています。Viewsロジックをまったく実行することは想定されていません (例外: for ループ、およびおそらく奇妙な if/else など)。これの主な理由はテストです。ええ、人々が嫌い、ヒッピー専用だと思っている汚い言葉です。または..テストする時間がない..だから私は手動でテストする..ビジネスロジックをビューに入れると、それをテストすることはできません。

2 番目の方法は、最初は少し遅いように見えるかもしれませんが、練習すればするほど速くなります。これは(IMO)コントローラーをテストできるため、推奨される方法です。コントローラは、ビューが必要とする正確な結果を持つビュー モデルを作成する必要があります。余分ではありません。たとえばBrands、ディスプレイ/ビューに のリストを返したいとします。ほとんどの人は (同等の) Get-all-brands をリストに入れ、そのリストをビューに送信しますが、これらのプロパティの 80% はそのビューで使用されることはありません! 1 つのプロパティがそのビューで使用されない場合でも、それを取得したり、ビューに送信したりしないでください。

だから - TL;DR; コントローラーですべての重い作業を行います。ビューはばかげています。正確なビュー モデル データをビューにダンプするだけです。

あなたの問題の解決策

では、アイデア 2 を実行して、このすべてをコントローラーで実行してみましょう。

// Grab the results.
// ASSUMPTION: It is only returning the -exact- data I need. No more, no less.
var results = _data.GetViewModel(query);
if (model == null)
{                

// Project the results into a perfectly tight & svelte view model 
// 100% specific for this view.
var viewModel = results.
                Select(x => new ViewModel
                {
                    Id = x.Id,
                    Brand = string.IsNullOrEmpty(x.Brand) 
                              ? string.Empty 
                              : x.Brand,
                    Family = string.IsNullOrEmpty(x.Family) 
                              ? string.Empty 
                              : x.Family,
                    Type = string.IsNullOrEmpty(x.Type) 
                              ? string.Empty 
                              : x.Type,
                }).ToList();    


return viewModel;

これをテスト..

[Fact]
public void GivenSomeBrands_Index_ReturnsAViewModel()
{
    // Arrange.
    // NOTE: Our fake repostitory has some fake data. In it ..
    //       Id: 1, Brand: Gucci.
    //       Id: 22, Brand: null.
    var controller = new BrandController(SomeFakeRepositoryThingy);

    // Act.
    var result = controller.Index(); // This calls that controller code, above.

    // Assert.
    Assert.IsNotNull(result); // Controller returned some result.
    Assert.IsNotNull(result.Model); // We have some model data.

    var model = result.Model as IList<ViewModel>(); // Cast the Model value.
    Assert.NotNull(model); // We have a strongly typed view model.

    // We check the first brand value.
    Assert.Equal("Gucci", model.First().Brand); 

    // We know this item has a null Brand, 
    Assert.Equal(string.Empty, model[21].Brand); but the ViewModel converted it.
}
于 2013-08-15T00:27:58.810 に答える
0

カスタム HTML ヘルパーを作成できます。

public static string MyHelper<V>(this HtmlHelper helper, V value, string css)
{
    if (value == null)
        return "";

    return String.Format("<span class='{0}'>{1}</span>", value, css);
}

次に、あなたの見解で:

@Html.MyHelper(Model.Brand, "brand");
@Html.MyHelper(Model.Family, "family");
@Html.MyHelper(Model.Type, "type");
于 2013-08-14T23:57:01.300 に答える