2009-09-10 10 views
12

Ich habe durch viele Tutorials auf jQuery draggable/droppable gesucht und versucht, es auf ASP.NET MVC anwenden, aber ich bin wirklich verwirrt.jQuery Draggable, Droppable, ASP.NET MVC

Die meisten der Proben, die ich finde, scheinen ziemlich schwierig zu verstehen, zumindest wenn es darum geht, wo die Dinge verkabelt sind. Ich versuche grundsätzlich, eine zielgerichtete Box (einen "Dienstplan") und eine Liste von Einheiten ("Teilnehmer") zu haben. Das Ziel besteht darin, beliebige Einheiten in die Box ziehen zu können, und sie werden dem Roster in der Datenbank hinzugefügt.

Kennt jemand einige einfachere Beispiele, die etwas Licht in die Verwendung dieses Teils von jQuery mit ASP.NET MVC bringen könnten?

Zum Beispiel habe ich mir http://philderksen.com/2009/06/18/drag-and-drop-categorized-item-list-with-jquery-and-aspnet-mvc-part-1/ angesehen und es ist ziemlich ordentlich, aber es erklärt einfach nicht, was ich brauche. Es macht nicht viel Sinn und der meiste Code ist ziemlich verstreut, und ich kann nicht einmal verfolgen, wo bestimmte Anrufe gemacht werden, um herauszufinden, wie die Dinge verkabelt sind. (Wie wird jQuery der Controller-Aktionen aufrufen, beispielsweise ausgelöst, wenn etwas fallen gelassen wird? Wie bekomme ich die ID des Elements so gezogen wird, ich es dem Ziel hinzufügen können?)


Hier, ich habe einige Änderungen vorgenommen - ich entschuldige mich für die Verwirrung. Es funktioniert immer noch nicht ganz so wie ich es versuche. Ist es möglich, dass Ereignisse nicht ausgelöst werden, wenn die Dinge in ihrer ursprünglichen Liste neu angeordnet werden, aber nur, wenn sie auf eine andere Liste fallen?

<%@ 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> 

Okay, ich versuche, Phil Anweisungen zu folgen, ist es das, was ich bisher ... Ich hoffe, ich bin noch auf dem richtigen Weg. Das ist alles sehr neu für mich. Ich versuche es und versuche es, aber das "Update" -Stück feuert nie. . .

<%@ 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> 

Und die 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> 

Und das Repository ...

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

Und der Controller

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

    } 
} 

Diese Methode bringt das Styling viel näher an Ihre Probe heran ... aber es funktioniert wirklich nicht. Es ist nicht die ID des Elements - aber die Elemente machen sich sortierbar scheint nicht zu arbeiten ....

<%@ 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> 
+0

Der Blog am Anfang verwiesen wird, kann nun hier: http://philderksen.com/2009/series-drag-and-drop-categorized-item-list-jquery-asp-net-mvc/ – Corin

Antwort

9

Stacey - Ich sehe, Sie meinen Blog sind Referenzierung und würde gerne helfen.Ich blogge auf einem größeren jquery asp.net mvc drag and drop-Projekt, also teile ich meine Beiträge in Teile und ich bin nur auf halbem Weg (3 Teile so weit). Grundsätzlich ist die Information, die Sie suchen, noch nicht alle da, sollte aber bald sein.

Für den Anfang, debuggen ich Ereignisse mit Firebug's logging Funktion. Hier ist ein Beispiel Veranstaltungen mit jQuery UI sortierbaren() Methode zu testen:

$("#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)); 
    } 
}); 

Wenn ein Element gelöscht wird mit sortierbar(), es löst das Aktualisierungsereignis. Ich benutze jQuerys AJAX Post-Methode, um die Daten an einen Controller zu senden.

Die Variable colNum extrahiert die ID, indem sie das ID-Attribut analysiert, das in der Ansicht festgelegt ist. In meinem Blog finden Sie unter part 3, wie das gerendert wird. Dann werden sowohl die Spaltennummer als auch der Satz von Abschnitts-IDs (in jQuery serialisiert) an den Controller gesendet.

Die Controller-Methode liegt in /Controllers/SectionController.cs und nur akzeptiert Beiträge:

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

Hoffnung, die jetzt hilft.

+0

Das ist eine handvoll. Du bist mir so weit voraus, dass ich ziemlich verloren bin. Aber ich werde sehen, ob ich mithalten kann - also möchte ich im Grunde die ID jedes Elements in der Ansicht speichern? Also setzen Sie das HTML-ID-Element auf col _ ###, wobei ## die "id" ist, und das geben Sie durch jQuery? – Ciel

+0

Bitte vergib mir, Phil, ich habe deinen Code ausprobiert und bin immer noch sehr verwirrt. Ich bin ein extremer Anfänger mit jQuery. Ich versuche nicht wirklich, die Reihenfolge zu ändern, ich versuche im Grunde, Elemente zu einer Liste hinzuzufügen. Weißt du wann du mehr davon veröffentlicht hast, damit ich es weiter erforschen kann? – Ciel

+0

Um Ihre erste Frage zu beantworten, ja, ich setze die ID jedes Elements auf col_ ### mit serverseitigem Code. Dann, wenn jQuery das Update-Ereignis abfeuert, nehme ich dieses ID-Attribut, analysiere die ID # von ihm und gebe dann die ID # mit jQuerys $ .post() an den Controller weiter. –

1

In jQuery UI abwerfbaren, gibt es ein Ereignis „Drop“, die nehmen können eine auszuführende Funktion. Hier müssen Sie also den Anruf mit der Aktion Ihres Controllers verbinden, um etwas bei einem "Drop" auszuführen. Es gibt auch andere Ereignisse, in die Sie sich einklinken können, z. B. "out", "hover" usw. Weitere Informationen finden Sie unter here unter "Ereignisse". Hier

ist ein Beispiel in Einhaken/Ihrer Steuerung Aktion Aufruf über „Drop“:

$('#mylist').droppable({ 
    drop: function(event, ui) { 
     var newItem = ui.droppable; 
     var url = <% =Url.Action("Append", "MyController") %>; 
     $.post(url, { newItemId: newItem[0].id }); 
    } 
}); 
0

Zing! Es ist getan worden. Das Problem war $ (this) .attr ("id"). Es musste $ (ui.item) .attr ("id") sein. Dadurch wird das Element, das gezogen wird, und nicht der sortierbare Container zurückgegeben. Vielen Dank für Ihre Hilfe.

<%@ 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>