2009-09-10 16 views
12

jQueryのdraggable/droppableについて多くのチュートリアルを見てきましたが、ASP.NET MVCに適用しようとしていますが、本当に混乱しています。jQuery Draggable、Droppable、ASP.NET MVC

私が見つけたサンプルのほとんどは、物が配線されている場所に関係するところでは、ほとんど理解できないようです。私は基本的にターゲット設定可能なボックス(「ロスター」)とユニットのリスト(「出席者」)を持っています。目標は、ユニットのいずれかをボックスにドラッグできるようにすることで、それらはデータベースの名簿に追加されます。

ASP.NET MVCでjQueryのこの部分を使用する方法について、いくつかの簡単なサンプルを知っている人はいますか?

例えば、私はhttp://philderksen.com/2009/06/18/drag-and-drop-categorized-item-list-with-jquery-and-aspnet-mvc-part-1/を見てきました。それはかなりきちんとしていますが、私は必要なものを説明していません。それは意味をなさないし、コードの大部分はかなり散らばっており、物事がどのように結ばれているかを把握するために特定の呼び出しが行われている場所をたどることさえできません。 (どのようにjQueryの何かがドロップされたときにトリガするために、例えば、コントローラのアクションを呼び出している?どのように私はアイテムの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"> 
    <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(); 
     } 

    } 
} 

この方法では、スタイリングがサンプルの状態に非常に近くなりますが、実際には機能しません。取ることができますjQueryのUIドロップ可能、イベントがある「ドロップ」で

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

先頭近くに参照ブログは今ここに見つけることができます:http://philderksen.com/2009/series-drag-and-drop-categorized-item-list-jquery-asp-net-mvc/ – Corin

答えて

9

ステイシーは - 私はあなたが私のブログを参照しているし、助けたいと思ってご覧ください。私は大きなjquery asp.net mvcのドラッグアンドドロッププロジェクトでブログをしていますので、私は自分の投稿を部分に分割し、私は半分ほどしか使っていません(これまでの3つの部分)。基本的に、あなたが探している情報はまだすべてではありませんが、すぐにそうすべきです。手始めに

、私はFirebug's logging機能を使用してイベントをデバッグします。ここでjQueryのUIのソート()メソッドとイベントをテストする例を示します。

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

アイテムが(ソート使用して削除された場合)には、更新イベントを発生させます。私はjQueryのAJAXポストメソッドを使用してデータをコントローラに送信します。

$("#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属性を解析することによってidを抽出しています。これがどのようにレンダリングされるかについては、私のブログのpart 3を参照してください。次に、列番号とセクションIDのセット(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"); 
    } 

希望を。

+0

これは非常に少数です。あなたは私よりずっとずっと前に、私はかなり失われています。しかし、私は追いつくことができますか?私は基本的に各項目のIDをビューに保存したいのですか?だから、HTMLのid要素をcol _ ###に設定します。##は "id"で、これがjQueryを通過するのですか? – Ciel

+0

私を許してください、フィル、あなたのコードを試しましたが、私はまだ非常に混乱しています。私はjQueryを使った極端な新人です。 私は実際に注文を変更しようとしていません、私は基本的にリストに項目を追加しようとしています。あなたがこの出版物の多くを持っているかも知っていますので、私はそれを研究し続けることができますか? – Ciel

+0

あなたの最初の質問に答えるために、はい、私は各要素のIDをサーバー側のコードでcol _ ###に設定しています。次に、jQueryが更新イベントを起動すると、そのid属性を取得してid#を解析し、id#をjQueryの$ .post()を使用してコントローラに渡します。 –

1

....しかし、要素自体はソート可能作ることはどちらか動作するようには思えない - それは要素のIDを取得していません実行する関数。ここでは、「ドロップ」で何かを実行するためにコントローラのアクションへの呼び出しを配線する必要があります。 "out"、 "hover"などの他のイベントもあります。詳しくは、イベントのhereを参照してください。ここで

は「ドロップ」を経由して、コントローラのアクションを呼び出す/フックの例です:

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

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>