Как удалить несколько элементов в MVC с помощью одной ссылки? - PullRequest
0 голосов
/ 04 октября 2009

Рассмотрим следующее:

Частичное представление:

<%= 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. Есть идеи?

Ответы [ 2 ]

1 голос
/ 05 октября 2009

Вы можете привязать массив, используя привязку модели к списку. ( Haacked.com Модель привязки к списку , здесь вы также можете увидеть, как связывать сложные типы).

Хотя я не доволен кодом, в котором я создаю элементы так что я могу сериализовать его, чтобы привязать его к входному параметру действия контроллера, этот код работает именно так, как вы хотите:

<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    }
});}

Надеюсь, это поможет ...

1 голос
/ 04 октября 2009

Как насчет этого кода?

  <%= 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()
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...