jQuery Draggable, Droppable, ASP.NET MVC - PullRequest
       18

jQuery Draggable, Droppable, ASP.NET MVC

12 голосов
/ 10 сентября 2009

Я просматривал множество учебных пособий по jQuery draggable / droppable и пытался применить его к ASP.NET MVC, но я действительно запутался.

Большинство сэмплов, которые я продолжаю находить, кажутся довольно трудными для понимания, по крайней мере, где это относится к тому, где что-то связано. Я в основном пытаюсь получить поле для таргетинга («список») и список юнитов («участников»). Цель состоит в том, чтобы иметь возможность перетаскивать любые блоки в поле, и они добавляются в реестр в базе данных.

Кто-нибудь знает некоторые более простые примеры, которые могут пролить свет на то, как использовать эту часть jQuery с ASP.NET MVC?

Например, я смотрел на http://philderksen.com/2009/06/18/drag-and-drop-categorized-item-list-with-jquery-and-aspnet-mvc-part-1/, и это довольно аккуратно, но это просто не объясняет, что мне нужно. Это не имеет большого смысла, и большая часть кода довольно разбросана, и я даже не могу проследить, где делаются определенные вызовы, чтобы выяснить, как все устроено. (Как jQuery вызывает, например, действия контроллера для запуска, когда что-то отбрасывается? Как получить идентификатор перетаскиваемого элемента, чтобы я мог добавить его к цели?)


Здесь я внес некоторые изменения - прошу прощения за путаницу. Это все еще не совсем работает, как я пытаюсь получить это. Можно ли сделать так, чтобы события не инициировались, если вещи перегруппированы в их первоначальном списке, но только если они перетаскиваются в другой список?

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Draggable.Item>>" %>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Index</h2>
    <div style="float: left; width: 250px;">
        <ul class="itemBox">
            <% foreach (var item in Model)
      { %>
            <% Html.RenderPartial("Item", item); %>
            <% } %>
        </ul>
    </div>
    <div style="float: left; width: 250px;">
        <ul class="itemBox">
            <p>
                Drop here</p>
        </ul>
    </div>
</asp:Content>
<asp:Content ContentPlaceHolderID="ScriptContent" runat="server">
    <style type="text/css">
        #draggable {
            width: 100px;
            height: 100px;
            padding: 0.5em;
            float: left;
            margin: 10px 10px 10px 0;
        }
        #droppable {
            width: 150px;
            height: 150px;
            padding: 0.5em;
            float: left;
            margin: 10px;
        }
    </style>

    <script type="text/javascript">
        $(function() {
            $(".itemList").sortable({
                connectWith: ".itemList",
                containment: "document",
                cursor: "move",
                opacity: 0.8,
                placeholder: "itemRowPlaceholder",

                update: function(event, ui) {
                    //Extract column num from current div id
                    var colNum = $(this).attr("id").replace(/col_/, "");
                    $.post("/Home/UpdateSortOrder", { columnNum: colNum, sectionIdQueryString: $(this).sortable("serialize") });
                }
            });
        });
    </script>

</asp:Content>

Хорошо, я пытаюсь следовать указаниям Фила, это то, что я имею до сих пор ... Я надеюсь, что я даже на правильном пути. Это все очень ново для меня. Я пытаюсь и пытаюсь, но вещи "обновления" никогда не стреляют. , .

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Draggable.Item>>" %>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Index</h2>
    <div style="float: left; width: 250px;">
        <ul id="sortable" class="itemBox">
            <% foreach (var item in Model)
      { %>
            <% Html.RenderPartial("Item", item); %>
            <% } %>
        </ul>
    </div>
    <div id="droppable" class="ui-widget-header">
        <p>
            Drop here</p>
    </div>
</asp:Content>
<asp:Content ContentPlaceHolderID="ScriptContent" runat="server">
    <style type="text/css">
        .draggable {
            width: 100px;
            height: 100px;
            padding: 0.5em;
            float: left;
            margin: 10px 10px 10px 0;
        }
        #droppable {
            width: 150px;
            height: 150px;
            padding: 0.5em;
            float: left;
            margin: 10px;
        }
    </style>

    <script type="text/javascript">
        $(function() {
            $("#sortable").sortable({
                update: function(event, ui) {
                    //Extract column num from current div id
                    var colNum = $(this).attr("id").replace(/item_/, "");

                    $.post("UpdateSortOrder", { columnNum: colNum, sectionIdQueryString: $(this).sortable("serialize") });
                }
            });
            $("#droppable").droppable({
                drop: function(event, ui) {
                    $(this).find('p').html('Dropped!');
                    //Extract column num from current div id
                    var colNum = $(this).attr("id").replace(/item_/, "");

                    $.post("UpdateSortOrder", { columnNum: colNum, sectionIdQueryString: $(this).sortable("serialize") });
                }

            });
        });
    </script>

</asp:Content>

И Item.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Draggable.Item>" %>

<li class="itemRow" id="item_<%= Model.ItemId %>">
    <p>Drag me to my target</p>
</li>

И хранилище ...

using System;
using System.Linq;

namespace Draggable
{
    public partial class ItemRepository
    {
        DatabaseDataContext database = new DatabaseDataContext();

        public IQueryable<Item> GetItems()
        {
            var items = from i in database.Items
                        select i;
            return items;
        }
    }
}

И контроллер

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace Draggable.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Index/

        public ActionResult Index()
        {
            ItemRepository repository = new ItemRepository();

            return View("Index", repository.GetItems());
        }

        public ActionResult Item()
        {
            return View();
        }

    }
}

Этот метод значительно приближает стиль к вашему сэмплу ... но на самом деле он не работает. Он не получает идентификатор элемента, но, похоже, создание самих элементов сортируемыми тоже не работает ....

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Draggable.Item>>" %>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Index</h2>
    <div class="itemBox">
        <ul class="itemList">
            <% foreach (var item in Model)
      { %>
            <% Html.RenderPartial("Item", item); %>
            <% } %>
        </ul>
    </div>
    <div class="itemBox">
        <ul class="itemList">
            <p>
                Drop here</p>
        </ul>
    </div>
</asp:Content>
<asp:Content ContentPlaceHolderID="ScriptContent" runat="server">
    <script type="text/javascript">
        $(function() {
            $(".itemList").sortable({
                connectWith: ".itemList",
                containment: "document",
                cursor: "move",
                opacity: 0.8,
                placeholder: "itemRowPlaceholder",

                update: function(event, ui) {
                    //Extract column num from current div id
                    var colNum = $(this).attr("id").replace(/col_/, "");
                    alert(colNum);
                    $.post("/Home/UpdateSortOrder", { columnNum: colNum, sectionIdQueryString: $(this).sortable("serialize") });
                }
            });
        });
    </script>

</asp:Content>

Ответы [ 3 ]

9 голосов
/ 11 сентября 2009

Стейси - я вижу, вы ссылаетесь на мой блог и хотели бы помочь. Я веду блог о более крупном проекте jquery asp.net mvc drag and drop, поэтому я разделил свои посты на части, и я только на полпути (пока 3 части). По сути, информация, которую вы ищете, еще не все, но должна быть в ближайшее время.

Для начала я отлаживаю события, используя возможность ведения журнала Firebug . Вот пример тестирования событий с помощью метода sortable () пользовательского интерфейса jQuery:

$("#mylist").sortable(
{
    ...
    start: function(event, ui)
    {
        console.log("-- start fired --");
        console.log($(ui.item));
    },

    update: function(event, ui)
    {
        console.log("-- update fired --");
        console.log($(ui.item));
    },

    deactivate: function(event, ui)
    {
        console.log("-- deactivate fired --");
        console.log($(ui.item));
    }
});

Когда элемент сбрасывается с помощью sortable (), он запускает событие обновления. Я использую метод jJuery post для отправки данных на контроллер.

$("#mylist").sortable(
{
    ...
    update: function(event, ui)
    {
        //Extract column num from current div id
        var colNum = $(this).attr("id").replace(/col_/, "");

        $.post("/Section/UpdateSortOrder",
            { columnNum: colNum, sectionIdQueryString: $(this).sortable("serialize") });

    }
});

Переменная colNum извлекает идентификатор, анализируя атрибут id, установленный в представлении. См. часть 3 в моем блоге, как это отображается. Затем и номер столбца, и набор идентификаторов разделов (сериализованных в jquery) отправляются на контроллер.

Метод контроллера находится в /Controllers/SectionController.cs и принимает только сообщения:

    private SectionRepository secRepo = new SectionRepository();

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult UpdateSortOrder(int columnNum, string sectionIdQueryString)
    {
        string[] separator = new string[2] { "section[]=", "&" };
        string[] sectionIdArray = sectionIdQueryString.Split(separator, StringSplitOptions.RemoveEmptyEntries);

        secRepo.UpdateSortOrder(columnNum, sectionIdArray);
        secRepo.Save();

        return Content("Success");
    }

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

1 голос
/ 10 сентября 2009

В jQuery UI droppable есть событие «drop», которое может выполнить функцию для выполнения. Так что это то место, где вам нужно будет связать вызов с действием вашего контроллера, чтобы выполнить что-то в «отбрасывании». Существуют и другие события, к которым вы можете подключиться, такие как "out", "hover" и т. Д. См. здесь в разделе "Events" для более подробной информации.

Вот пример подключения / вызова действия вашего контроллера через «drop»:

$('#mylist').droppable({
   drop: function(event, ui) {
       var newItem = ui.droppable;
       var url = <% =Url.Action("Append", "MyController") %>;
       $.post(url, { newItemId: newItem[0].id });
   }
});
0 голосов
/ 11 сентября 2009

Zing! Это было сделано. Проблема была в $ (this) .attr ("id"). Это должен был быть $ (ui.item) .attr ("id"). Это возвращает перетаскиваемый элемент, а не сортируемый контейнер. Большое вам спасибо за вашу помощь.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Draggable.Item>>" %>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ContentPlaceHolderID="MainContent" runat="server">
    <ul id="sortable1" class="connectedSortable">
        <% foreach (var item in Model)
     { %>
        <% Html.RenderPartial("Item", item); %>
        <% } %>
    </ul>
    <ul id="sortable2" class="connectedSortable">
    </ul>
</asp:Content>
<asp:Content ContentPlaceHolderID="ScriptContent" runat="server">
    <style type="text/css">
        #sortable1, #sortable2 {
            list-style-type: none;
            margin: 0;
            padding: 0;
            float: left;
            margin-right: 10px;
        }
        #sortable2 {
            height: 400px;
            width: 140px;
            background: #ccc;
        }
        #sortable1 li, #sortable2 li {
            margin: 0 5px 5px 5px;
            padding: 5px;
            font-size: 1.2em;
            width: 120px;
        }
    </style>

    <script type="text/javascript">
        $(function() {
            $("#sortable1").sortable({
                connectWith: '.connectedSortable'
            }).disableSelection();
            $("#sortable2").sortable({
                connectWith: '.connectedSortable',
                receive: function(event, ui) {
                    var colNum = $(ui.item).attr("id").replace(/col_/, "");
                    $.post("/Home/UpdateSortOrder", { columnNum: colNum, sectionIdQueryString: $(this).sortable("serialize") });
                }
            }).disableSelection();
        });
    </script>
</asp:Content>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...