2

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.

4

2 回答 2

5

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

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

所以我将创建一个这样的视图模型。

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 处理表单提交时的集合。该帖子显示了处理单选按钮的示例。

于 2012-10-15T02:00:43.047 回答
4

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

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

在此处输入图像描述

在标记中它看起来像这样

在此处输入图像描述

并且在回发后的控制器中,使用用户输入的新数据重建模型,并且还惰性绑定到 ForeignKey 模型!

在此处输入图像描述

使用复选框或无线电输入略有不同。问题是当一个复选框没有被勾选时,浏览器不会提交它,模型也不会重建。这不是 VS 的不足,而是仍然存在于 HTML5 中的 HTML1 的预期实现!

如果发生这种情况,将发生索引超出范围。因此,您在输入框之前包含了一个值为 false 的复选框的隐藏字段(如果用户选中它,它会将 false 覆盖为 true)

但是,如果您使用的是 StronglyTyped 模型,例如在我的情况下,任何评估为 null 的复选框都会自动设置为 false,这称为 C# 规范中定义的布尔值的默认值。

于 2014-01-03T22:54:55.173 回答