任何人都可以告诉我在mvc3-asp中从按钮点击视图到控制器发布列表的代码。我有一个列表,其中一个列表元素是复选框。首先我必须从列表中选择一些值然后提交它只保存选定的值。
答案 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
,而无需任何额外的工作。
在标记中它看起来像这样
在回发后的控制器中,使用用户输入的新数据以及lazyBound到ForeignKey模型重建模型!
使用复选框或无线电输入略有不同。问题是当没有勾选复选框时,浏览器不会将其提交回来,并且模型将不会重建。这不是VS的缺点,而是HTML1的预期实现,仍然存在于HTML5中!
如果发生这种情况,将发生Index Out of Bounds。因此,您在输入框之前为复选框包含一个隐藏字段,其值为false(如果用户检查它,则会将false覆盖为true)
但是,如果使用的是StronglyTyped模型,如在我的情况下,评价为空任何复选框被自动设置为false,已知为一个布尔默认值作为C#规范中定义。