我有一些简单的列表管理页面,每个页面都严格遵循以下ViewModel

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

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

我想将所有这些都放在一个页面上,而不是每个页面都有单独的 View 。我认为partials可能是实现此目的的方法,但是我不清楚这是否是推荐的方法?

我也不清楚如何处理 Controller 。就目前情况而言;与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个 Controller 做完全相同的事情,只是类型不同。如果我将所有内容放到1个“主”单 View 页面上,我将需要以某种方式将所有5个PagedList集合填充到1个ViewModel中,然后在“主”单版本中将数据传递给相关的Partials Razor 代码?

另外,我将如何处理其他Controller Action (Edit,Create和Delete)?

更新
我的想法-如果统一/单个 View 页面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)方法
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;
}

然后在我的 View 中,模型将包含ManagementLists集合,并且我可以像我目前正在做的那样将结果foreach到html表中,但要放在单独的页面上。

但是,对结果的分页将导致所有列表表分页,而不仅仅是Priority表。我将如何使用Ajax进行每次更新,因此在一个表中进行分页只会更新该表中的列表?如果我要重新包括搜索,该搜索当前在ActionResult方法中,但未在UI中实现,则还需要仅更新Priorities表。例如,如果我在“优先级”搜索中输入“高”,则只想查询优先级表并更新它,而不对数据库运行5个查询以在“类别”或任何其他列表中搜索“高”。

最佳答案

我认为,仅当您打算再次使用时,才应使用部分。我经常看到人们创建它们来帮助分解代码,但是再也没有使用它们。

在一个页面下放置5个列表会更有条理,这样它们就全部在一个模型中,并且由一个 Controller /模型集中管理。

关于c# - 显示Ajax更新的多个相关ViewModel的MVC页面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15669191/

10-12 00:29
查看更多