0

モデル クラス内では、次のように IsAlreadyAssigned メソッド呼び出しを使用しています。

public partial class DataCenter 
{
     public bool IsAlreadyAssigned()
     {
         return (TMSRacks.Any() ||  TMsRouters.Any() || Zones.Any());
     }
}

このヘルパー メソッドの主な目的は、オブジェクトに子レコードがある場合にビューの削除ボタンを非表示にすることです。次のように:-

<td>
    @Html.ActionLink("Edit", "Edit", new { id= item.ID}) 
    @if (!item.IsAlreadyAssigned()) 
    { 
        <text>|</text> 
        @Ajax.ActionLink("Delete",
                         "Delete", "DataCenter",
                         new { id = item.ID },
                         new AjaxOptions
                         { 
                             Confirm = "Are You sure You want to delete (" + item.Name + ")",
                             HttpMethod = "Post",
                             OnSuccess = "deletionconfirmation",
                             OnFailure = "deletionerror"
                         })

    }
</td>

しかし、一度に 10 個のレコードを表示するインデックス ビューでは、それに応じて削除リンクを非表示または表示するため、次のようにクエリにすべてのナビゲーション プロパティを含める必要があります。

public IQueryable<DataCenter> AllFindDataCenters(string q, bool forautocomplete = false)
{
    return from datacenter in tms.DataCenters.Where(a=> (String.IsNullOrEmpty(q)) || ( a.Name.ToUpper().StartsWith(q.ToUpper())))
        .Include(a=>a.Zones)
        .Include(a=>a.TMsRouters)
        .Include(a=>a.TMSRacks)
        select datacenter;
}

それ以外の場合、インデックス ビューの各レコードは、子レコードがあるかどうかを確認するために、DB に対して最大 3 つのクエリを実行する可能性があります。したがって、削除リンクを非表示/表示するという要件を実装するためだけに、上記のようにすべてのナビゲーション プロパティを含めることになりました。ナビゲーション プロパティ データ (tmsrouter、tmsfirewalls、zonea) を表示する必要がないため、ロジックを管理するためのより良い方法はありますか? ありがとう

4

1 に答える 1

2

ビューでビジネス モデルを直接操作する代わりに、ビューモデルを返し、必要な情報を公開します。

public class DataCenterViewModel
{
    ...
    public bool HasZones { get; set; }
    public bool HasTmsRouters { get; set; }
    public bool HasTmsRacks { get; set; }

    public bool AlreadyAssigned { get { return HasZones || HasTmsRouters || HasTmsRacks; } }
}

次に、クエリでビュー モデルを構築します。IEnumerable<T>また、参考までに、ビューに何かを渡すときのように、より一般的な構造をIQueryable<T>使用することをお勧めします。ビューで一度データ ソースをさらにクエリすることをお勧めします。

public IEnumerable<DataCenterViewModel> AllFindDataCenters(string q, bool forautocomplete = false)
{
    return tms.DataCenters.Where(...)
                          .Select(x => new DataCenterViewModel
                                       {
                                           ...
                                           HasZones = x.Zones.Any(),
                                           HasTmsRouters = x.TMSRouters.Any(),
                                           HasTmsRacks = x.TMSRacks.Any()
                                       })
                          .ToList();

}

そして最後にあなたの見解で

<td>
@Html.ActionLink("Edit", "Edit", new { id= item.ID}) 
@if (!item.AlreadyAssigned) 
{
    ...
}
</td>
于 2013-11-13T10:50:21.393 に答える