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

时间:2009-09-02 22:41:36

标签: asp.net-mvc

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

我希望能够在每个帖子上返回将下拉列表的所有值发送回控制器,维护它们在数组中的位置。我发现的是,只有更改的值被回发,我无法确定哪个值已更改

??什么,你可能会问。这是一个例子:

  1. 该页面允许用户输入 他们家的规格。第一 他们从下拉列表中选择, drpRooms,房间数量 他们的房子(让我们说用户 进入5)。

  2. 这回发到服务器和 视图再渲染5次 下载列表,drpRoom0,drpRoom1, drpRoom2 ... drpRoom4,每一滴 向下列表允许他们选择 那个家具的数量 房间,1到10之间的数字。

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

    drpRoom0:2
    drpRoom1:4
    drpRoom2:1
    drpRoom3:8
    drpRoom4:9

  4. 当用户点击“继续”时 将表格发回去,我得到的价值 控制器作为一个数组,即一个类型的数组 int:int [],其值为{2,4,1,8, 9}。到这里我没关系,我可以将下拉列表作为一个int数组发回(我通过对每个下拉列表使用相同的名称来执行此操作,但是唯一的ID)

  5. 这会做一些处理等等 向前。视图将被渲染回来 对用户而言他们可以改变一个 价值,说他们改变了价值 drpRoom3为值2,当用户 点击继续,我回过头来 服务器是一个值为1的数组 在索引0因此,我无法 确定哪个下拉列表 改变。

  6. 我知道我可以用Json做到这一点,但我正在寻找Javascript独立的方式,其中todo这个

1 个答案:

答案 0 :(得分:4)

您可以使用MVC SelectList对象来生成DropDownList控件,并使用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的选项(请参阅 AllowedRoomValues )。

接下来,在“编辑”视图中,使用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属性永远不为null,否则您将抛出NullRef异常。最好的方法是通过构造函数和setter,我在ViewModel中完成。

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

[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();
    }
}

为了简洁,我省略了所有数据验证的东西,你明白了! OTH!