can anyone please show me the code for posting a list on button click from view to controller in mvc3-asp. i have a list in which one of the list element is check box.at first i have to select some of the values from list then submit it to save the selected values only.
2 回答
你的问题有两个广泛的回答。所以我会给你一个通用的例子,你需要根据你的场景进行定制。
假设你的观点是给用户分配一些任务。可以为每个用户分配一个或多个任务。
所以我将创建一个这样的视图模型。
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 属性设置为可用任务列表(可能来自您的数据库)
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)
}
这是一篇博客文章,解释了如何使用 EditorTemplates 处理表单提交时的集合。该帖子显示了处理单选按钮的示例。
您实际上可以跳过控制器中的所有这些重建。Razor 可以使用单个表单重建任何对象的列表。您只需要回退到旧的for
并分配一个唯一的名称,并包括该集合的主键。
在回发剃须刀将使用修改后的列表重建您ViewModel
,而无需任何额外的工作。
在标记中它看起来像这样
并且在回发后的控制器中,使用用户输入的新数据重建模型,并且还惰性绑定到 ForeignKey 模型!
使用复选框或无线电输入略有不同。问题是当一个复选框没有被勾选时,浏览器不会提交它,模型也不会重建。这不是 VS 的不足,而是仍然存在于 HTML5 中的 HTML1 的预期实现!
如果发生这种情况,将发生索引超出范围。因此,您在输入框之前包含了一个值为 false 的复选框的隐藏字段(如果用户选中它,它会将 false 覆盖为 true)
但是,如果您使用的是 StronglyTyped 模型,例如在我的情况下,任何评估为 null 的复选框都会自动设置为 false,这称为 C# 规范中定义的布尔值的默认值。