代码之家  ›  专栏  ›  技术社区  ›  Jaimal Chohan

MVC:将值数组发布到控制器

  •  1
  • Jaimal Chohan  · 技术社区  · 16 年前

    我有一个ASP.NET MVC网站。其中一个页面允许用户动态地向页面添加下拉列表,即用户输入5,这将发回服务器,在视图中我创建5个下拉列表。

    我要做的就是在每一个岗位上 将下拉列表的所有值发送回控制器,保持它们在数组中的位置。 .我发现只有更改后的值才会被回发,我无法确定更改的值

    ??什么,你可以问。下面是一个例子:

    1. 该页面允许用户输入 他们房子的规格。弗斯特 他们从下拉列表中选择, drprooms,房间数 他们的房子(比如用户 进入5)。

    2. 这将发回服务器和 视图以5个附加的拖放方式呈现 下拉列表,drproom0,drproom1, DrPROM2…DRProom4,每滴 下拉列表允许他们选择 其中家具项目数 房间,1到10之间的数字。

    3. 用户选择以下内容 每个下拉列表的值

      DRPROMO0:2
      DRPROM1:4
      DRPROM2:1
      DRPROM3:8
      DrPROM4:9

    4. 当用户单击“继续”时, 将表单发回,我在 控制器作为阵列,即类型的数组 int:int[],值为2、4、1、8, 9 }。在这里,我很好,我可以得到一个int数组的下拉列表(我通过对每个下拉列表使用相同的名称,但唯一的ID来完成此操作)

    5. 这将做一些处理,因此 第四。视图将被渲染回 用户可以更改 价值,比如说他们改变了 drproom3到值2,当用户 单击“继续”,我将返回 服务器是一个值为1的数组 在索引0。所以我不能 确定哪个下拉列表是 改变。

    我知道我可以用JSON来实现这一点,但是我正在寻找一种Javascript独立的方式来实现这一点。

    1 回复  |  直到 16 年前
        1
  •  4
  •   Matthew Perron    16 年前

    您可以使用MVC SelectList对象来生成下拉列表控件,并使用Model/ViewModel模式来保持系统中的更改。

    首先,创建用于将数据传递到视图的ViewModel类:

    public class RoomDetailsViewModel
    {
        private int _numberOfRooms;
        public int NumberOfRooms
        {
            get { return _numberOfRooms; }
            set
            {
                _numberOfRooms = value;
    
                RoomDetails = new List<SelectList>(_numberOfRooms);
                for(int i = 0; i < _numberOfRooms; i++)
                    RoomDetails.Add(new SelectList(AllowedRoomValues));
            }
        }
        public List<SelectList> RoomDetails { get; set; }
    
        public RoomDetailsViewModel(RoomDetailsModel model)
        {
            // Get useful info from dataModel
            NumberOfRooms = model.NumberOfRooms;
        }
    
        public static int[] AllowedRoomValues = new [] {0, 1, 2, 3, 4, 5, 6,7,8,9,10};
    }
    

    注意selectlist的用法。这些将用于生成所需的DropDownList。您可以通过提供值列表来限制selectlist的选项(请参见 允许的房间值 )

    接下来,在“编辑”视图中,使用HTML助手生成下拉列表:

    <% using (Html.BeginForm()) {%>
    
        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="NumberOfRooms">NumberOfRooms:</label>
                <%= Html.TextBox("NumberOfRooms", Model.NumberOfRooms) %>
                <%= Html.ValidationMessage("NumberOfRooms", "*") %>
            </p>
    
            <% for(int i = 0; i < Model.NumberOfRooms; i++)
               { %>
                    <%= Html.DropDownList("drpRoom" + i,Model.RoomDetails[i]) %>
            <% } %>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    
    <% } %>
    

    如您所见,必须确保RoomDetails属性从不为空,否则将引发NullRef异常。实现这一点的最佳方法是通过构造函数和setter,我在ViewModel中实现了这一点。

    最后,您需要在控制器的后编辑操作中更新您的模型:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection collection)
    {
        // Grab the actual data model from your ORM repository of choice here
        RoomDetailsModel dataModel = roomDetailRepository.GetItem(r => r.HouseID == id);
    
        try
        {
            // Updating the model/
            for (int i = 0; i < model.NumberOfRooms; i++) // iterate over actual room count
                dataModel.RoomDetails[i] = int.Parse(collection["drpRoom" + i]);
    
            // Generate a ViewModel from your actual DataModel in order to display.
            RoomDetailsViewModel viewModel = new RoomDetailsViewModel(dataModel);
    
            // display back the view using the viewModel.
            return View(viewModel);
        }
        catch
        {
            // error handling...
            return View();
        }
    }
    

    我省略了所有的数据验证资料,你明白了!哎呀!