【问题标题】:How to delete multiple items in MVC with a single link?如何使用单个链接删除 MVC 中的多个项目?
【发布时间】:2009-10-04 13:09:20
【问题描述】:

考虑以下:

局部视图:

<%= Html.ListBox("BlackList", Model.Select(
                    x => new SelectListItem
                             {
                                   Text = x.Word, 
                                   Value = x.ID.ToString(), 
                                   Selected = Model.Any(y=> y.ID == x.ID)
                             }))%>

主视图:

 <td><% Html.RenderPartial("GetBlackList", ViewData["BlackList"]); %></td>

控制器:

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult DeleteWord(int[] wordIdsToDelete)
    {
        if (!ModelState.IsValid)
           return View();
        try
        {
            _wordManager.DeleteWord(wordIdsToDelete);
          return RedirectToAction("WordList");
        }
        catch
        {
            return View();
        }
    }

模型(WordManager)

    public void DeleteWord(int[] idsToDelete)
    {
        var dataContext = GetLinqContext();
        var currentList = GetTabooWordList();

        foreach (var id in idsToDelete)
        {
            foreach (var item in currentList)
            {
                if (item.ID == id)
                {
                       dataContext.BadWords.DeleteOnSubmit(item);
                }
            }
        }
        dataContext.SubmitChanges();
    }

问题是如何正确传递参数 - idsForDel ? 即我必须将客户端数据传递给服务器?

   <%= Html.ActionLink("Delete Selected", "DeleteWord", "AdminWord", new { wordIds = idsForDel })%>

我认为这可以通过 jQuery 来实现。有什么想法吗?

【问题讨论】:

    标签: c# jquery asp.net-mvc


    【解决方案1】:

    您可以使用模型绑定到列表来绑定到数组 (Haacked.com Model binding to a list,在这里你也可以看到如何绑定复杂类型)。

    虽然我对创建元素的代码不满意 所以我可以序列化它以将其绑定到控制器操作输入参数,此代码可以满足您的需求:

    <script type="text/javascript">
    function DeleteWords() { 
    var el = $("<form></form>");
    //for every selected item create new input element and insert it
    //inside of temporarty created form element 
    var selItems = $('#BlackList option:selected').each(function(intIndex) {
    
        //is important how you name input elements (as you can read in link I referenced)
        el.append($('<input/>')
         .attr({ type: "hidden", name: "wordIdsToDelete", value: $(this).val() })
        );
    });
    
    //make an ajax call with serialized temporary form
    $.ajax({
        type: "POST",
        url: "/YourController/DeleteWord",
        data: $(el).serialize(),
       // error: HandleUnespectedError,
        success: function(response) {
            //handle response    }
    });}
    

    希望这会有所帮助...

    【讨论】:

      【解决方案2】:

      这段代码怎么样?

        <%= Html.ActionLink("Delete Selected", "DeleteWord", 
                            "AdminWord", new { id="send" })%>
        <script type="text/javascript">
          $(function() {
            $("#send").click(function() {
              $.post(
                $("form:first").attr("action"),
                $("#GetBlackList").serialize()
              );
            });
          });
        </script>
      

      而且,如果两个或更多记录被删除,DeleteAllOnSubmit 是好的。

        dataContext.BadWords.DeleteAllOnSubmit(
          currentList.Where(item=>currentList.Containts(item.id)).ToList()
        );
      

      【讨论】:

      • 我知道你的想法,谢谢。但是如果我想传递一个数组呢?
      • 我错了。 dataContext.BadWords.DeleteAllOnSubmit(currentList.Where(item=>idsToDelete.Containts(item.id)).ToList());
      猜你喜欢
      • 2020-05-05
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2015-11-04
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多