2

我有一些简单的列表管理页面,每个页面都是针对以下 ViewModel 进行强类型化的

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

我有类别、优先级、状态和其他一些下拉列表的视图,有一些 AutoMapper 配置可确保Name属性绑定到域模型可能对实体具有的任何内容。这个想法是系统管理员能够管理这些列表中的内容(新建、编辑现有和删除)。这给了我一个这样的索引视图:

优先列表管理

我想将所有这些放在一个页面上,而不是为每个页面设置单独的视图。认为 可能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 进行每次更新,因此在一个表中分页只会更新该表中的列表?如果我要重新包含搜索,它当前在 ActionResult 方法中,但未在 UI 中实现,也需要仅更新 Priorities 表。例如,如果我在优先级搜索中输入“高”,我只想查询优先级表并更新它,而不是对数据库运行 5 次查询以在类别或任何其他列表中搜索“高”。

4

1 回答 1

2

如果您打算再次使用它,我认为您应该只使用部分。我经常看到人们创建它们来帮助分解代码,但它们再也没有被使用过。

将 5 个列表放在一个页面下会更有条理,这样它们都在一个模型中,并由一个控制器/模型集中管理。

于 2013-03-27T20:59:58.653 回答