[6][A.Thông điệp][slider-top-big][nothing]
You are here: Home / , , , Lưu trạng thái sau khi Sort menu với Jquery trong Asp.net

Lưu trạng thái sau khi Sort menu với Jquery trong Asp.net

| No comment

Đôi khi bạn muốn cho người dùng lưu trạng thái menu của mình.

Chẳng hạn G+. Các biểu tượng có thể sort lên xuống qua lại cho nhau và vẫn lưu trạng thái trên menu dù bạn có logout tài khoản của mình hay refresh lại trang web.

Một menu sort và lưu vào tài khoản người dùng của G+

Bài viết này sẽ hướng dẫn bạn cách để làm điều đó.

1. Tạo CSDL

- Tạo một bảng Items gồm có các giá trị là ItemID, ItemName, ItemOrder

GO
CREATE TABLE [Items]
(
[ItemID] INT IDENTITY ,
[ItemName] VARCHAR(50) ,
[ItemOrder] INT
)
GO
INSERT INTO [Items]
SELECT 'Item1' ,
1
INSERT INTO [Items]
SELECT 'Item2' ,
2
INSERT INTO [Items]
SELECT 'Item3' ,
3
INSERT INTO [Items]
SELECT 'Item4' ,
4
INSERT INTO [Items]
SELECT 'Item5' ,
5
INSERT INTO [Items]
SELECT 'Item6' ,
6
INSERT INTO [Items]
SELECT 'Item7' ,
7
INSERT INTO [Items]
SELECT 'Item8' ,
8
INSERT INTO [Items]
SELECT 'Item9' ,
9
INSERT INTO [Items]
SELECT 'Item10' ,
10
GO

- Tạo một Procedure là SelectItems có code như sau


GO
CREATE PROCEDURE [SelectItems]
AS
BEGIN
SET NOCOUNT ON

SELECT [ItemID] ,
[ItemName]
FROM [Items]
ORDER BY [ItemOrder] ASC

SET NOCOUNT OFF
END
GO

- Tạo một Update SP với code


GO
CREATE PROCEDURE [UpdateItemsOrder]
@ItemOrder VARCHAR(255)
AS
BEGIN


SET NOCOUNT ON
DECLARE @Temp TABLE
(
[ItemOrder] INT IDENTITY ,
[ItemID] INT
)
INSERT INTO @Temp
SELECT [Value]
FROM dbo.SPLIT(@ItemOrder, ',')
SET NOCOUNT OFF
UPDATE [Items]
SET [Items].[ItemOrder] = [Temp].[ItemOrder]
FROM [Items]
INNER JOIN @Temp [Temp] ON [Items].[ItemID] = [Temp].[ItemID]

END
GO

- Tạo một Function Split để cắt chuỗi rồi update lại bảng


GO
CREATE FUNCTION [Split]
(
@text VARCHAR(MAX) ,
@delimiter VARCHAR(20) = ' '
)
RETURNS @Strings TABLE
(
[position] INT IDENTITY
PRIMARY KEY ,
[value] VARCHAR(100)
)
AS
BEGIN
DECLARE @index INT
SET @index = -1
WHILE ( LEN(@text) > 0 )
BEGIN -- Find the first delimiter
SET @index = CHARINDEX(@delimiter, @text)

IF ( @index = 0 )
AND ( LEN(@text) > 0 )
BEGIN
INSERT INTO @Strings
VALUES ( CAST(@text AS VARCHAR(100)) )
BREAK
END

IF ( @index > 1 )
BEGIN
INSERT INTO @Strings
VALUES ( CAST(LEFT(@text, @index - 1) AS VARCHAR(100)) )
SET @text = RIGHT(@text, ( LEN(@text) - @index ))
END --Delimiter is 1st position = no @text to insert
ELSE
SET @text = CAST(RIGHT(@text, ( LEN(@text) - @index )) AS VARCHAR(100))
END
RETURN
END

GO


2. Code 

-Tạo một class Item


[Serializable]
public class Item
{
public int ItemID { get; set; }
public string ItemName { get; set; }
public int ItemOrder { get; set; }
}

- Tạo một file .aspx. Dùng ListView để Select Item


<%@ Page Language="C#" %>

<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Collections.ObjectModel" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/themes/redmond/jquery-ui.css"
type="text/css" media="all" />

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>

<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.min.js"
type="text/javascript"></script>

<script type="text/javascript">

$(function() {
$('#sortable').sortable({
placeholder: 'ui-state-highlight',
update: OnSortableUpdate
});
$('#sortable').disableSelection();

var progressMessage = 'Saving changes... <img src="loading.gif"/>';
var successMessage = 'Saved successfully!';
var errorMessage = 'There was some error in processing your request';
var messageContainer = $('#message').find('p');

function OnSortableUpdate(event, ui) {
var order = $('#sortable').sortable('toArray').join(',').replace(/id_/gi, '')
//console.info(order);

messageContainer.html(progressMessage);

$.ajax({
type: 'POST',
url: 'Sortable.asmx/UpdateItemsOrder',
data: '{itemOrder: \'' + order + '\'}',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: OnSortableUpdateSuccess,
error: OnSortableUpdateError
});
}

function OnSortableUpdateSuccess(response) {
if (response != null && response.d != null) {
var data = response.d;
if (data == true) {
messageContainer.html(successMessage);
}
else {
messageContainer.html(errorMessage);
}
//console.info(data);
}
}

function OnSortableUpdateError(xhr, ajaxOptions, thrownError) {
messageContainer.html(errorMessage);
}

});

</script>

<style type="text/css">
#sortable
{
list-style-type: none;
margin: 0;
padding: 0;
width: 400px;
}
#sortable li
{
margin: 0 5px 5px 5px;
padding: 5px;
font-size: 1.2em;
height: 1.5em;
cursor: move;
}
html > body #sortable li
{
height: 1.5em;
line-height: 1.2em;
}

</style>
</head>
<body>
<form id="form1" runat="server">

<div class="ui-widget" id="message">
<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
<p>
Reorder Items
</p>
</div>
</div>

<br />
<ul id="sortable">
<asp:ListView ID="ItemsListView" runat="server" ItemPlaceholderID="myItemPlaceHolder">
<LayoutTemplate>
</LayoutTemplate>
<LayoutTemplate>
<asp:PlaceHolder ID="myItemPlaceHolder" runat="server"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<li class="ui-state-default" id='id_<%# Eval("ItemID") %>'>
<%# Eval("ItemName") %></li>
</ItemTemplate>
</asp:ListView>
</ul>
</form>
</body>
</html>

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
ItemsListView.DataSource = FindItems();
ItemsListView.DataBind();

}

public static IEnumerable<Item> FindItems()
{
Collection<Item> items = new Collection<Item>();
string connectionString =
"Data Source=YourServerName; Initial Catalog=YourDatabase; User ID=YourUserName; Password=YourPassword";

using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = "SelectItems";
command.CommandType = CommandType.StoredProcedure;

connection.Open();
using (SqlDataReader dataReader = command.ExecuteReader())
{
Item item;
while (dataReader.Read())
{
item = new Item();
item.ItemID = (int)dataReader["ItemID"];
item.ItemName = Convert.ToString(dataReader["ItemName"]);
items.Add(item);
}
}
}
}
return items;
}
</script>


- Tạo một file Webservice để cập nhật sự kiện khi sort.


using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;


/// <summary>
/// Summary description for Sortable
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class Sortable : System.Web.Services.WebService
{


[WebMethod]
public bool UpdateItemsOrder(string itemOrder)
{
Collection<Item> items = new Collection<Item>();
string connectionString =
"Data Source=YourServerName; Initial Catalog=YourDatabase; User ID=YourUserName; Password=YourPassword";

using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = "UpdateItemsOrder";
command.CommandType = CommandType.StoredProcedure;

SqlParameter paramUserName = new SqlParameter("@ItemOrder", SqlDbType.VarChar, 255);
paramUserName.Value = itemOrder;
command.Parameters.Add(paramUserName);


connection.Open();
return (command.ExecuteNonQuery() > 0);

}
}

}
}


- Ok. Đã xong. Bây giờ bạn hãy chạy và sort thử. Kiểm tra CSDL sẽ thấy các trạng thái của bạn sau sort được lưu.