从View向Controller提交列表

时间:2012-10-15 01:37:37

标签: asp.net-mvc

任何人都可以告诉我在mvc3-asp中从按钮点击视图到控制器发布列表的代码。我有一个列表,其中一个列表元素是复选框。首先我必须从列表中选择一些值然后提交它只保存选定的值。

2 个答案:

答案 0 :(得分:4)

你的问题有两个广泛的答案。所以我会给你一个通用的例子,你需要根据你的场景进行自定义。

假设您的观点是为用户分配一些任务。可以为每个用户分配一个或多个任务。

所以我将创建一个这样的viewmodel。

public class UserViewModel 
{
  public int UserId { set;get;}
  public string Name { set;get;}
  public List<Task> Tasks { set;get;}
  public UserViewModel()
  {
     Tasks=new List<UserTask>();
  }      
}
public class UserTask
{
  public int ID { set;get;}
  public string Name { set;get;}      
  public bool IsSelected { set;get;}
}

现在在GET操作中,您创建了一个UserViewModel对象,并将Tasks属性设置为可用的taks列表(可能来自您的数据库)

public ActionResult Add()
{
  var vm=new UserViewModel();
  vm.Tasks=GetAvailableTasks();
  return View(vm);
}

假设GetAvailableTasks是一个返回UserTask个对象列表的方法。

现在创建一个编辑器模板。转到~/Views/YourControllerName文件夹,创建一个名为EditorTemplates的文件夹。将新视图添加到新创建的文件夹,并将名称命名为Task.cshtml。将以下代码添加到

@model YourNameSpace.UserTask
<p>
   @Html.CheckBoxFor(x => x.IsSelected)  Model.Name
   @Html.HiddenFor(x => x.ID)
</p>

现在返回主视图并使用EditorFor辅助方法来启动EditorTemplate。

@model YourNamespace.UserViewModel
<h2>Quiz 24</h2>
@using (Html.BeginForm())
{
    @Html.EditorFor(x=>x.Tasks)
    <input type="submit" />
}

现在提交表单时,您可以获得所选的复选框值,如此

[HttpPost]
public ActionResult Save(UserViewModel model)
{
   List<int> taskIds=new List<int>();
   foreach (var task in model.Tasks)
   {
     if (task.IsSelected)
     {
       //you can get the selected task id's here. 
       taskIds.Add(task.ID);    
     }
   } 
   //to do : save and redirect (PRG pattern)
}

Here是一篇博文,解释了如何使用EditorTemplates处理表单提交上的集合。帖子显示了一个处理单选按钮的例子。

答案 1 :(得分:4)

您实际上可以跳过控制器中的所有重建。 Razor可以使用单个表单重建任何对象的列表。您只需要回退到旧的for并分配一个唯一的名称,并包含该集合的主键。

在回发时,剃须刀将使用修改后的列表重建您的ViewModel,而无需任何额外的工作。

enter image description here

在标记中它看起来像这样

enter image description here

在回发后的控制器中,使用用户输入的新数据以及lazyBound到ForeignKey模型重建模型!

enter image description here

使用复选框或无线电输入略有不同。问题是当没有勾选复选框时,浏览器不会将其提交回来,并且模型将不会重建。这不是VS的缺点,而是HTML1的预期实现,仍然存在于HTML5中!

如果发生这种情况,将发生Index Out of Bounds。因此,您在输入框之前为复选框包含一个隐藏字段,其值为false(如果用户检查它,则会将false覆盖为true)

但是,如果使用的是StronglyTyped模型,如在我的情况下,评价为空任何复选框被自动设置为false,已知为一个布尔默认值作为C#规范中定义。