我有一个asp.net MVC网站。其中一个页面允许用户动态地向页面添加下拉列表,即用户输入5,这会回发到服务器,在视图中我创建了5个下拉列表。
我希望能够在每个帖子上返回将下拉列表的所有值发送回控制器,维护它们在数组中的位置。我发现的是,只有更改的值被回发,我无法确定哪个值已更改
??什么,你可能会问。这是一个例子:
该页面允许用户输入 他们家的规格。第一 他们从下拉列表中选择, drpRooms,房间数量 他们的房子(让我们说用户 进入5)。
这回发到服务器和 视图再渲染5次 下载列表,drpRoom0,drpRoom1, drpRoom2 ... drpRoom4,每一滴 向下列表允许他们选择 那个家具的数量 房间,1到10之间的数字。
用户选择以下内容 每个下拉列表的值
drpRoom0:2
drpRoom1:4
drpRoom2:1
drpRoom3:8
drpRoom4:9
当用户点击“继续”时 将表格发回去,我得到的价值 控制器作为一个数组,即一个类型的数组 int:int [],其值为{2,4,1,8, 9}。到这里我没关系,我可以将下拉列表作为一个int数组发回(我通过对每个下拉列表使用相同的名称来执行此操作,但是唯一的ID)
这会做一些处理等等 向前。视图将被渲染回来 对用户而言他们可以改变一个 价值,说他们改变了价值 drpRoom3为值2,当用户 点击继续,我回过头来 服务器是一个值为1的数组 在索引0因此,我无法 确定哪个下拉列表 改变。
我知道我可以用Json做到这一点,但我正在寻找Javascript独立的方式,其中todo这个
答案 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!