如何从MVC4中的视图传递List <model>到控制器?</model>

时间:2014-05-14 22:50:47

标签: c# asp.net-mvc asp.net-mvc-4

如何将List<model>从视图传递到控制器?请参阅下面的示例@Html.ActionLink。我想要点击删除后选择的checkboxes用户是什么。

模型

  public class Images
    {
        public string Imgs { get; set; }
        public bool chkSelected { get; set; }
    }

视图

@model IEnumerable<Models.Images>

@using (Html.BeginForm())
{

 <span class="galleryImage">
   @foreach (var image in Model)
   {
     <a href="@Url.Content("~/ImageGallery/" + image.Imgs)"  data-gallery>
          <img src="@Url.Content("~/ImageGallery/thumbnails/" + image.Imgs)">
     </a>
      @Html.CheckBox("delete_CheckBox", false, new {Value = image.chkSelected})
   }
 </span>
 <span class="btn btn-primary fileinput-button">
    <i class="glyphicon glyphicon-trash"></i>
       @Html.ActionLink("Delete files...", "Delete", "Image") //Pass from here
 </span>
}

控制器

[HttpGet]
[Route("Admin/Image/Delete")]
public ActionResult Delete(IEnumerable<Images> imageses)
{
  //Here Imageses are coming null
   return null;
}

3 个答案:

答案 0 :(得分:1)

不幸的是,它不会那样工作。

您需要将List保留在Session(或TempData)

Session["imageses"] = list;

这样您就可以在请求之间访问它。

修改

在您的控制器httppost操作中,您将会话转换回列表,然后在保存回数据库之前遍历表单中的复选框

答案 1 :(得分:1)

这可以通过模型绑定来完成,您只需要模型的正确语法。

<input type="hidden" value="1" name="images[0].Id"></input>
<input type="checkbox" checked="checked" name="images[0].Delete"></input>
<input type="hidden" value="2" name="images[1].Id"></input> 
<input type="checkbox" name="images[1].Delete"></input>

基本上你只需要描述数组符号和属性,然后模型绑定器将完成剩下的工作。

此处有更多信息:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

修改

我还应该注意,模型绑定器也可以使用JSON表示法

[ 
    { Id : 1, Delete : true }, 
    { Id : 2, Delete : false } 
]

答案 2 :(得分:1)

对不起,我写了这封信并跟踪了,但我还是会发帖:

这不是ASP.NET webforms,其中存在可以发送回服务器的页面状态。对于这样的事情,我会使用ajax将id的数组发送回控制器,然后执行我的del

<span class="galleryImage">
   @foreach (var images in Model)
   {
     <a href="@Url.Content("~/ImageGallery/" + images.Imgs)"  data-gallery>
          <img src="@Url.Content("~/ImageGallery/thumbnails/" + images.Imgs)" id="myImages">
     </a>
      @Html.CheckBox("delete_CheckBox", false, new {Value = images.ID})
   }
 </span>
 <span class="btn btn-primary fileinput-button">
    <i class="glyphicon glyphicon-trash"></i>
       @Html.ActionLink("Delete files...", "Delete", "Image", new { @id = "delete" }) //Pass from here
 </span>

然后设置你的控制器:

[HttpPost]
[Route("Admin/Image/Delete")]
public ActionResult Delete(int[] ids)
{
   foreach(int i in ids)
      // delete
   return Content("successfully deleted " + ids.Length + " items.");
}

你的js:

$("#delete").click(function(e) {
   e.preventDefault();
   var arr = new Array();
   $("#myImages:checked").each(function () { arr.push($(this).val()); });
   $.post("admin/image/delete", { ids: arr },
       function(data) {
           alert(data);
       });

});