1

我把自己打结了——我认为最好退后一步,回到基础。

我知道我应该使用 ViewModel,所以这就是我想要构建的。

我的演示应用程序将有 4 个部分(需要填写表格的 4 个不同部分):

  1. 从用户那里获取日期/天数
  2. 使用该数据查询数据库,并返回符合条件的记录列表——每一条记录都有一个唯一的 TypeID ID——对于每一条记录,它们还应该有 2 个与之关联的动态 DropDownLists(以便在每个列表的 ListBox3 对应于 TypeID3(以及任何 ID)
  3. 然后,用户将能够再次从动态填充的下拉列表中选择 Extras
  4. 将收集用户姓名/地址/电话

我对 ViewModel 需要看起来/保持的“视图”是:

在此处输入图像描述

我相信我的 viewModel 应该是这样的:

public class SearchViewModel
    {
        public DateTime Date{ get; set; }
        public int Days { get; set; }
        public IQueryable<TypeID> TypeIDs { get; set; }
        public IQueryable<LB1Item> LB1Items { get; set; }
        public IQueryable<LB2Item> LB2Items { get; set; }
        public IQueryable<Extras> Extras { get; set; }
        public string Name { get; set; }
        public string Add { get; set; }
        public string Tel { get; set; }
        public string email { get; set; }
    }

首先 - 这就是我上面描述的构建 ViewModel 的方式吗?我不确定下拉框,对于每个表单,检索到的每个 TypeID 可能有 1、2、3....10、11、12 - 基于所选日期。

LB1Item 和 LB2Item 的每个下拉框 - 还需要根据每行的 TypeID 存储它们的选定值。

这就是我认为 1 个下拉菜单的类应该是这样的:

public class LB1Item
{
        public String TypeName { get; set; }
        public long TypeID { get; set; }
        public int NumSelected { get; set; }
        public int TypeCount { get; set; }
        public IEnumerable<SelectListItem> CarsAvail 
        {
            get
            {
                return new SelectList(
                    Enumerable.Range(0, TypeCount+1)
                    .OrderBy(typecount => typecount)
                    .Select(typecount => new SelectListItem
                    {
                        Value = typecount.ToString(),
                        Text = typecount.ToString()
                    }
                ), "Value", "Text");
            }
        } 
}

这看起来也好吗?还是我使我想要实现的目标过于复杂?

我还希望,在每个阶段(1、2、3、4)之后回传数据以使用所选值主动填充 ViewModel - 并将其传递回视图,以便我可以检索它下一步。

我想要结束的是这样的:

Date: 01/09/2012
Days: 4
{ List:
   TypeID:    3059   ListBox1: 2   ListBox2: 8748,
   TypeID:    2167   ListBox1: 7   ListBox2: 2378,
   TypeID:    4983   ListBox1: 4   ListBox2: 5873
}
{List:
   ExtraID:  4324,
   ExtraID:  3878,
   ExtraID:  4872,
   ExtraID:  7698,
   ExtraID:  2873
}
Name: Mark
Add: My town
Tel: 0912378
Email: me@me.com

感谢您提供任何帮助/指针/示例...

标记

4

1 回答 1

1

对于这种类型的解决方案,我会将要呈现为单独视图的每个部分分开,并使用Jquery ajax方法使用 Ajax 调用。我还将使用KnockoutJS来处理您客户端中的视图。因此,您实际上将拥有两个 ViewModel,一个在客户端的 JavaScript 中,一个在 MVC 中,用于返回您需要的片段作为来自客户端的 Ajax 调用的 JSON。您的视图的第 1 部分由用户输入到客户端,因此您在控制器端不需要它。第 1 节基本上是用于查询第 2 节的数据。也无需将集合设为 IQueryable,因为您不会查询返回的列表。您在 Controller 端的 ViewModel 可能看起来像这样:

public class Section2
{
    public List<TypeID> TypeIDs { get; set; }
    public List<LB1Item> LB1Items { get; set; }
    public List<LB2Item> LB2Items { get; set; }
}

public class Section3
{
    public List<Extras> Extras { get; set; }
}

public class Section4
{
    public string Name { get; set; }
    public string Add { get; set; }
    public string Tel { get; set; }
    public string email { get; set; }
}

因此,将采取的步骤是,当引发用户输入日期和日期的事件时,将使用输入的数据和日期将 Ajax 调用返回给控制器,以查询将填充第 2 节的信息。控制器将 Section2 ViewModel 作为 JSON 返回,并使用 Knockout 在 HTML 中呈现。然后,当用户从第 2 节中的列表中进行选择时,将引发一个事件以再次查询控制器以返回填充第 3 节所需的信息,并重复该循环。

有一个很好的例子,使用 Knockout 来做你想做的事情

于 2012-08-08T13:45:29.330 回答