2

簡単なリスト管理ページがいくつかあり、それぞれが次の ViewModel に対して強く型付けされています

public class ListManagementIndexViewModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Nameカテゴリ、優先度、ステータス、およびその他のいくつかのドロップダウンのビューがあります。ドメインモデルがエンティティに対して持つ可能性のあるものにプロパティがバインドされるようにする AutoMapper 構成があります。これは、システム管理者がこれらのリスト (新規作成、既存の編集、および削除) の内容を管理できるようにするというものです。これにより、次のようなそれぞれのインデックス ビューが得られます。

優先リスト管理

それぞれに個別のビューを用意するのではなく、これらすべてを 1 つのページに配置したいと考えています。おそらくこれを行う方法だと思います partialsが、それが推奨されるアプローチであるかどうかはわかりませんか?

また、コントローラーの処理方法についても明確ではありません。現状では。PriorityController を使用すると、次のインデックスがありますActionResult

public ActionResult Index(string searchString, string currentFilter, int? page)
    {
        if (Request.HttpMethod == "GET")
            searchString = currentFilter;

        ViewBag.CurrentFilter = searchString;
        int pageNumber = page ?? 1;

        var query = Session.QueryOver<Priority>();

        if (!string.IsNullOrWhiteSpace(searchString))
            query.WhereRestrictionOn(p => p.PriorityName)
                 .IsInsensitiveLike(String.Format("%{0}%", searchString));

        var result = query.OrderBy(p => p.PriorityName).Asc.List();

        var viewModel = AutoMapper.Mapper.Map<IEnumerable<Priority>, 
                          IEnumerable<ListManagementIndexViewModel>>(result)
                                  .ToPagedList(pageNumber, PageSize);

        return View(viewModel);
    }

それを「マスター」単一リスト管理ページに移動することもできますが、他のリスト タイプについても同じことを行う必要がありますが、ViewModel をどのように表示する必要があるかというと、現在、管理するリストが 5 つあるため、 5 つのコントローラーがまったく同じことを行いますが、種類のみが異なります。すべてを 1 つの「マスター」シングル ビュー ページに配置する場合、5 つの PagedList コレクションすべてを 1 つの ViewModel に詰め込み、「マスター」シングル バージョンでデータを関連するかみそりコードに渡す必要がありますか?Partials

また、他のコントローラ アクション (編集、作成、および削除) をどのように処理しますか?


私の足元で考えを更新します-統合/単一ビューページのViewModelが次の場合:

public class ListManagementIndexViewModel
{
    public Dictionary<string, IPagedList<T>> ManagementLists { get; set; }
}

そしてSinglePageControllerは

public ActionResult Index(string searchString, string currentFilter, int? page)
{
    var priorities = GetPriorities(searchString, currentFilter, page);
    var categories = GetCategories(searchString, currentFilter, page);

    Dictionary<string, IPagedList> viewModel
       = new Dictionary<string, IPagedList<T>>();

    viewModel.Add("Priorities", priorities);
    viewModel.Add("Categories", categories);
    return View(viewModel);
}

既存のロジックをプライベート メソッドに移動できます

private IPagedList<Priority> GetPriorities(string searchString, 
                                           string currentFilter, int? page) 
{
    if (Request.HttpMethod == "GET")
        searchString = currentFilter;

    ViewBag.CurrentFilter = searchString;
    int pageNumber = page ?? 1;

    var query = Session.QueryOver<Priority>();

    if (!string.IsNullOrWhiteSpace(searchString))
        query.WhereRestrictionOn(p => p.PriorityName)
             .IsInsensitiveLike(String.Format("%{0}%", searchString));

    var result = query.OrderBy(p => p.PriorityName).Asc.List();

    var priorities = AutoMapper.Mapper.Map<IEnumerable<Priority>, 
                          IEnumerable<ListManagementIndexViewModel>>(result)
                                  .ToPagedList(pageNumber, PageSize);

    return priorities;
}

次に、私のビューでは、モデルにManagementListsコレクションが含まれ、foreach現在行っているように結果を html テーブルにすることができますが、別のページに表示されます。

ただし、結果をページングすると、プライオリティ テーブルだけでなく、すべてのリスト テーブルがページングされます。Ajax を使用して各更新を行うにはどうすればよいでしょうか。1 つのテーブルをページングすると、その 1 つのテーブルのリストのみが更新されます。現在 ActionResult メソッドにありますが、UI には実装されていない検索を再度含めるとしたら、Priorities テーブルだけを更新する必要があります。たとえば、優先度の検索で「高」と入力した場合、優先度テーブルを照会して更新するだけで、データベースに対して 5 つのクエリを実行してカテゴリまたは他のリストの「高」を検索する必要はありません。

4

1 に答える 1

2

もう一度使用する場合にのみ、パーシャルを使用する必要があると思います。コードを分解するためにそれらを作成する人をよく見かけますが、二度と使用されることはありません。

1 つのページの下に 5 つのリストを配置すると、より整理されます。そのようにして、それらはすべて 1 つのモデル内にあり、1つのコントローラー/モデルによって集中管理されます。

于 2013-03-27T20:59:58.653 に答える