'2010/02'에 해당되는 글 3건

  1. 2010.02.26 가사 다운로드
  2. 2010.02.18 Xml to Json
  3. 2010.02.10 JQGrid using MVC, Json and Datatable.
2010.02.26 18:42

가사 다운로드

http://dongho.springnote.com/pages/1095688
신고
Trackback 1 Comment 0
2010.02.18 10:48

Xml to Json

How to convert XML to JSON in ASP.NET C#


Last modified: 18 July 2006.   Any comments or suggestions - please fill in form below. Chris Cant.
No download provided - cut and paste to try out. The following code is provided as-is without any warranty of any kind.
  • Code to convert XML to JSON in ASP.NET C#
  • Example of how to insert JSON code into a page when the page is generated
  • Please acknowledge PHD Computer Consultants Ltd (PHDCC) if you use this code
  • Introduction

    JSON is a lightweight data-interchange format. It is particularly useful because it can be 'decoded' easily by web page JavaScript into object form.

    AJAX-based web pages use XmlHttpRequest to receive data from a server in response to a user action. While the returned data is normally in XML format, it can also be returned in JSON string format and processed more easily in JavaScript.

    Many applications may store information in XML format. However they may want to send data to a client using JSON. To achieve this, they must convert their XML data into JSON format. The ASP.NET C# code below does this job.

    Code Description

    The code provides a method private static string XmlToJSON(XmlDocument xmlDoc) that converts an XmlDocument into a JSON string. The code iterates through each XML element, its attributes and children, creating the corresponding JSON objects.
    • The code never generates number or boolean values.
    • The XML documentElement is always reported as member:object even if it could be shortened by the following rules.
    • Element attributes are converted into member "attr_name":"attr_value".
      XML JSON
      <xx yy='nn'></xx> { "xx": {"yy":"nn"} }
      <xx yy=''></xx> { "xx": {"yy":""} }
    • Element children with no attributes, children or text are converted into member "child_name":null
      XML JSON
      <xx/> { "xx":null }
    • Element children with no attributes or children but contain text are converted into "child_name":"child_text"
      XML JSON
      <xx>yyy</xx> { "xx":"yyy" }
    • Other element attributes and children are converted into "child_name":object or an array "child_name":[elements] as appropriate, with element text converted into a member with name "value"
      XML JSON
      <xx yy='nn'><mm>zzz</mm></xx> { "xx": {"yy":"nn", "mm":"zzz"} }
      <xx yy='nn'><mm>zzz</mm><mm>aaa</mm></xx> { "xx": {"yy":"nn", "mm": [ "zzz", "aaa" ] } }
      <xx><mm>zzz</mm>some text</xx> { "xx": {"mm":"zzz", "value":"some text"} }
      <xx value='yyy'>some text<mm>zzz</mm>more text</xx> { "xx": {"mm":"zzz", "value": [ "yyy", "some text", "more text" ] } }
    • Characters are made safe for conversion into JSON. Note that this does not protect your JavaScript from attack if any of the source XML comes from an unsafe source, eg user input.
      XML JSON
      <aa>/z'z"z\yyy<aa>< {"aa": "\/z\u0027z\"z\\yyy" }

    In some special circumstances, such as in the example below, you may need to escape the backslash characters again, eg:

    string JSON = XmlToJSON(doc);
    JSON = JSON.Replace(@"\", @"\\");

    Note that there may be security implications for web pages using unchecked XML contents.

    Example

    The examples on this page come from my Space Browse site.

    XML Input:

    <space name="Cake Collage">
    <frame>
      <photo img="cakecollage1.jpg" />
      <text string="Browse my cake space" />
      <rule type="F" img="cakecollage9.jpg" x="150" y="0" w="300" h="250" />
      <rule type="F" img="cakecollage2.jpg" x="0" y="0" w="150" h="220" />
    </frame>
    <frame>
      <photo img="cakecollage2.jpg" />
      <rule type="B" img="cakecollage1.jpg" />
      <rule type="L" img="cakecollage3.jpg" />
    </frame>
    </space>
    

    JSON Output (re-formatted):

    { "space":
      { "name": "Cake Collage",
        "frame": [ {"photo": { "img": "cakecollage1.jpg" },
                    "rule": [ { "type": "F",
                                "img": "cakecollage9.jpg",
                                "x": "150",
                                "y": "0",
                                "w": "300",
                                "h": "250"
                              }, 
                              { "type": "F",
                                "img": "cakecollage2.jpg",
                                "x": "0",  
                                "y": "0",  
                                "w": "150",  
                                "h": "220" 
                              }
                            ],
                    "text": { "string": "Browse my cake space" }
                   },
                   {"photo": { "img": "cakecollage2.jpg" },
                    "rule": [ { "type": "B", "img": "cakecollage1.jpg" },
                              { "type": "L",  "img": "cakecollage3.jpg" }
                            ]
                   }
                 ]
      }
    }
    

    Once the JSON has been converted into a JavaScript object, eg called space_DOM, the following objects are available:

    • space_DOM.space.name
    • space_DOM.space.frame.length
    • space_DOM.space.frame[0].text.string
    • space_DOM.space.frame[0].rule[0].type

    Your JavaScript code should be flexible to cope with members not existing, members existing as a single value, or members existing as an array. I find it useful to have a JavaScript function ObjectToArray which converts all these cases into an Array of length 0, 1 or greater.

    function ObjectToArray( obj)
    {
        if( !obj) return new Array();
        if( !obj.length) return new Array(obj);
        return obj;
    }
    
    space_DOM.space.frame = ObjectToArray(space_DOM.space.frame);
    

    XmlToJSON C# code

    You may wish to use some of the updates suggsted in the comments below.
    private static string XmlToJSON(XmlDocument xmlDoc)
    {
        StringBuilder sbJSON = new StringBuilder();
        sbJSON.Append("{ ");
        XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);
        sbJSON.Append("}");
        return sbJSON.ToString();
    }
    
    //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
    private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
    {
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");
        sbJSON.Append("{");
        // Build a sorted list of key-value pairs
        //  where   key is case-sensitive nodeName
        //          value is an ArrayList of string or XmlElement
        //  so that we know whether the nodeName is an array or not.
        SortedList childNodeNames = new SortedList();
    
        //  Add in all node attributes
        if( node.Attributes!=null)
            foreach (XmlAttribute attr in node.Attributes)
                StoreChildNode(childNodeNames,attr.Name,attr.InnerText);
    
        //  Add in all nodes
        foreach (XmlNode cnode in node.ChildNodes)
        {
            if (cnode is XmlText)
                StoreChildNode(childNodeNames, "value", cnode.InnerText);
            else if (cnode is XmlElement)
                StoreChildNode(childNodeNames, cnode.Name, cnode);
        }
    
        // Now output all stored info
        foreach (string childname in childNodeNames.Keys)
        {
            ArrayList alChild = (ArrayList)childNodeNames[childname];
            if (alChild.Count == 1)
                OutputNode(childname, alChild[0], sbJSON, true);
            else
            {
                sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
                foreach (object Child in alChild)
                    OutputNode(childname, Child, sbJSON, false);
                sbJSON.Remove(sbJSON.Length - 2, 2);
                sbJSON.Append(" ], ");
            }
        }
        sbJSON.Remove(sbJSON.Length - 2, 2);
        sbJSON.Append(" }");
    }
    
    //  StoreChildNode: Store data associated with each nodeName
    //                  so that we know whether the nodeName is an array or not.
    private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
    {
    	// Pre-process contraction of XmlElement-s
        if (nodeValue is XmlElement)
        {
            // Convert  <aa></aa> into "aa":null
            //          <aa>xx</aa> into "aa":"xx"
            XmlNode cnode = (XmlNode)nodeValue;
            if( cnode.Attributes.Count == 0)
            {
                XmlNodeList children = cnode.ChildNodes;
                if( children.Count==0)
                    nodeValue = null;
                else if (children.Count == 1 && (children[0] is XmlText))
                    nodeValue = ((XmlText)(children[0])).InnerText;
            }
        }
        // Add nodeValue to ArrayList associated with each nodeName
        // If nodeName doesn't exist then add it
        object oValuesAL = childNodeNames[nodeName];
        ArrayList ValuesAL;
        if (oValuesAL == null)
        {
            ValuesAL = new ArrayList();
            childNodeNames[nodeName] = ValuesAL;
        }
        else
            ValuesAL = (ArrayList)oValuesAL;
        ValuesAL.Add(nodeValue);
    }
    
    private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)
    {
        if (alChild == null)
        {
            if (showNodeName)
                sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
            sbJSON.Append("null");
        }
        else if (alChild is string)
        {
            if (showNodeName)
                sbJSON.Append("\"" + SafeJSON(childname) + "\": ");
            string sChild = (string)alChild;
            sChild = sChild.Trim();
            sbJSON.Append("\"" + SafeJSON(sChild) + "\"");
        }
        else
            XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);
        sbJSON.Append(", ");
    }
    
    // Make a string safe for JSON
    private static string SafeJSON(string sIn)
    {
        StringBuilder sbOut = new StringBuilder(sIn.Length);
        foreach (char ch in sIn)
        {
            if (Char.IsControl(ch) || ch == '\'')
            {
                int ich = (int)ch;
                sbOut.Append(@"\u" + ich.ToString("x4"));
                continue;
            }
            else if (ch == '\"' || ch == '\\' || ch == '/')
            {
                sbOut.Append('\\');
            }
            sbOut.Append(ch);
        }
        return sbOut.ToString();
    }
    

    Using XmlToJSON

    The following code shows how to use XmlToJSON() when an ASP.NET 2 page loads. It then uses the ASP.NET2 ClientScriptManager to insert code containing the JSON string into the web page. See the following section for an example of JavaScript space_processJSON().

    protected void Page_Load(object sender, EventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        try
        {
            string path = Server.MapPath(".");
            doc.Load(path+"whatever.xml");
        }
        catch (Exception ex)
        {
            lblError.Text = ex.ToString();
            return;
        }
    
        // Convert XML to a JSON string
        string JSON = XmlToJSON(doc);
        
        // Replace \ with \\ because string is being decoded twice
        JSON = JSON.Replace(@"\", @"\\");
        
        // Insert code to process JSON at end of page
        ClientScriptManager cs = Page.ClientScript;
        cs.RegisterStartupScript(GetType(), "SpaceJSON", "space_processJSON('" + JSON + "');", true);
    }
    

    Client-side code

    <script src="space/json.js" type="text/javascript"></script>
    
    <script type="text/javascript">
    function space_processJSON( JSON)
    {
        space_DOM = JSON.parseJSON();
        if( !space_DOM)
        {
            alert("JSON decode error");
            return;
        }
        space_DOM.space.frame = ObjectToArray(space_DOM.space.frame);
        space_frameCount = space_DOM.space.frame.length;
        .. or whatever
    }
    </script>
    

    Comments:

    Michael, Mon, 19 Jun 2006 16:46:05 (GMT)
    See this implementation: http://groups.google.de/group/ajaxpro/browse_thread/thread/219f830011e5ca6f/9e72c85fcf802a84#9e72c85fcf802a84

    Damon Carr, Thu, 07 Sep 2006 12:24:31 (GMT)
    Excellent work.

    Alex Egg, Sun, 31 Dec 2006 06:31:43 (GMT)
    Question: Why is XmlToJSON private? Wouldn't it be more appropriate for this method to be declared as public? Also, I think you should change the XmlDocument parameter of XmlToJSON to an XmlNode, it would be much more versatile.
    Also, I have discovered you code does not produce correct JSON when the xml contains cdata blocks

    Eric Walker, Mon, 8 Oct 2007 08:01:45 -0700
    I found that an empty xml node was not being decoded properly (an extra } was being added). So for example <foo /> would be translated as {"foo" : }}
    By tracking whether or not a child was added, I was able to work arround this issue:
    //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
            public static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
            {
                bool childAdded = false;
                if (showNodeName)
                    sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");
                sbJSON.Append("{");
                // Build a sorted list of key-value pairs
                //  where   key is case-sensitive nodeName
                //          value is an ArrayList of string or XmlElement
                //  so that we know whether the nodeName is an array or not.
                SortedList childNodeNames = new SortedList();
    
                //  Add in all node attributes
                if (node.Attributes != null)
                    foreach (XmlAttribute attr in node.Attributes)
                        StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
    
                //  Add in all nodes
                foreach (XmlNode cnode in node.ChildNodes)
                {
                    childAdded = true;
                    if (cnode is XmlText)
                        StoreChildNode(childNodeNames, "value", cnode.InnerText);
                    else if (cnode is XmlElement)
                        StoreChildNode(childNodeNames, cnode.Name, cnode);
                }
    
                // Now output all stored info
                foreach (string childname in childNodeNames.Keys)
                {
                    childAdded = true;
                    ArrayList alChild = (ArrayList)childNodeNames[childname];
                    if (alChild.Count == 1)
                        OutputNode(childname, alChild[0], sbJSON, true);
                    else
                    {
                        sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
                        foreach (object Child in alChild)
                            OutputNode(childname, Child, sbJSON, false);
                        sbJSON.Remove(sbJSON.Length - 2, 2);
                        sbJSON.Append(" ], ");
                    }
                }
                sbJSON.Remove(sbJSON.Length - 2, 2);
                if (childAdded)
                {
                    sbJSON.Append(" }");
                }
                else
                {
                    sbJSON.Append(" null");
                }
            }
    
    I hope this is helpful.

    Leon, Mon, 22 Oct 2007 09:20:55 -0700
    Another way to do it (DataContractJsonSerializer):
    http://blogs.msdn.com/kaevans/archive/2007/09/04/use-linq-and-net-3-5-to-convert-rss-to-json.aspx

    Mark Brito, Tue, 19 Feb 2008 21:16:32 GMT
    In spirit of helping .. I found a bug where there is only one element in the xml, it would make it a single element instead of an array.. simply change the following line of code..
    if (alChild.Count == 1)
    to
    if (alChild.Count == 1 && (alChild[0] is string))
    Below is the entire function.
    public static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
    {
        bool childAdded = false;
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");
        sbJSON.Append("{");
        // Build a sorted list of key-value pairs
        //  where   key is case-sensitive nodeName
        //          value is an ArrayList of string or XmlElement
        //  so that we know whether the nodeName is an array or not.
        SortedList childNodeNames = new SortedList();
    
        //  Add in all node attributes
        if (node.Attributes != null)
            foreach (XmlAttribute attr in node.Attributes)
                StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
    
        //  Add in all nodes
        foreach (XmlNode cnode in node.ChildNodes)
        {
            childAdded = true;
            if (cnode is XmlText)
                StoreChildNode(childNodeNames, "value", cnode.InnerText);
            else if (cnode is XmlElement)
                StoreChildNode(childNodeNames, cnode.Name, cnode);
        }
    
        // Now output all stored info
        foreach (string childname in childNodeNames.Keys)
        {
            childAdded = true;
            ArrayList alChild = (ArrayList)childNodeNames[childname];
            bool bFlag = false;
            foreach (object oChild in alChild) bFlag = true;
            if (alChild.Count == 1 && (alChild[0] is string))
                OutputNode(childname, alChild[0], sbJSON, true);
            else
            {
                sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
                foreach (object Child in alChild)
                    OutputNode(childname, Child, sbJSON, false);
                sbJSON.Remove(sbJSON.Length - 2, 2);
                sbJSON.Append(" ], ");
            }
        }
        sbJSON.Remove(sbJSON.Length - 2, 2);
        if (childAdded)
        {
            sbJSON.Append(" }");
        }
        else
        {
            sbJSON.Append(" null");
        }
    }

    Milind Amin, Fri, 25 Jul 2008 06:52:56 GMT
    Thanks. Very Good Article.

    Paul Chu, Thu, 16 Oct 2008 01:52:44 GMT
    Thank you and all the other contributors for this excellent article.
    Does the last post contain all the suggested enhancements ?

    Answer: I haven't tested the suggestions but they look good!

    Chris, Thu, 13 Nov 2008 04:47:25 GMT
    I could see where this would come in handy. Hats off to you for that. Overall, I would prefer to build JSON from real objects which gives me the ability to serialize to XML, JSON, or whatever.

    noone, Mon, 06 Apr 2009 12:55:55 GMT
    Use the .NET 3.5 JavaScript Serializer: System.Web.Script.Serialization.JavaScriptSerializer

    Michele Costabile, Wed, 20 May 2009 13:33:31 GMT
    I had a problem with an extra brace at the end of the file. I solved it checking that I really had to remove two characters from the end of the string buffer in XmlToJSONnode. The following is my version of the function. Maybe further inspection of the code would be in order for finding a more elegant solution, but this is what I managed to do in a short time.
    //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array
    private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
    {
        if (showNodeName)
            sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");
        sbJSON.Append("{");
        // Build a sorted list of key-value pairs
        //  where   key is case-sensitive nodeName
        //          value is an ArrayList of string or XmlElement
        //  so that we know whether the nodeName is an array or not.
        SortedList childNodeNames = new SortedList();
    
        //  Add in all node attributes
        if (node.Attributes != null)
            foreach (XmlAttribute attr in node.Attributes)
                StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
    
        //  Add in all nodes
        foreach (XmlNode cnode in node.ChildNodes)
        {
            if (cnode is XmlText)
                StoreChildNode(childNodeNames, "value", cnode.InnerText);
            else if (cnode is XmlElement)
                StoreChildNode(childNodeNames, cnode.Name, cnode);
        }
    
        // Now output all stored info
        bool hasAddedChild = false;
        foreach (string childname in childNodeNames.Keys)
        {
            ArrayList alChild = (ArrayList)childNodeNames[childname];
            if (alChild.Count == 1 && (alChild[0] is string))
            {
                hasAddedChild = true;
                OutputNode(childname, alChild[0], sbJSON, true);
            }
            else
            {
                sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");
                foreach (object Child in alChild)
                {
                    hasAddedChild = true;
                    OutputNode(childname, Child, sbJSON, false);
                }
                if (hasAddedChild)
                    sbJSON.Remove(sbJSON.Length - 2, 2);
                sbJSON.Append(" ], ");
            }
        }
        if (hasAddedChild)
            sbJSON.Remove(sbJSON.Length - 2, 2);
        sbJSON.Append(" }");
    }
    

    Overide, Thu, 09 Jul 2009 11:09:49 GMT
    ObjectToArray(obj): function is incorrect if obj is String. Maybe better:
    function ObjectToArray( obj)
    {
        if (!obj) return new Array();
        if (!(obj instanceof Array)) return new Array(obj);
        return obj;
    }
    

    Override, Fri, 10 Jul 2009 08:39:11 GMT
    and also it conflicts with JQuery. Line: v = f(v); - not enough memory

    lucky, Fri, 21 Aug 2009 01:29:39 GMT
    Thank

    Karl, Thu, 15 Oct 2009 23:46:49 GMT
    I added a check for numeric values, to optionally display the quotes.
    In OutputNode() change the one line with the quotes to:
    Double temp;
    if (Double.TryParse(sChild, out temp))
     sbJSON.Append(SafeJSON(sChild));
    else
     sbJSON.Append("\"" + SafeJSON(sChild) + "\"");

    출처 : http://www.phdcc.com/xml2json.htm
    신고

    '소프트웨어 > C# & ASP.NET' 카테고리의 다른 글

    Xml to Json  (0) 2010.02.18
    JQGrid using MVC, Json and Datatable.  (0) 2010.02.10
    C# 강좌  (0) 2010.01.12
    C# 4.0의 새로운 기능  (0) 2009.12.15
    잉여들을 위한 클래스설계 이야기 2/4  (0) 2009.12.11
    잉여들을 위한 클래스설계 이야기 1/4  (0) 2009.12.11
    Trackback 3 Comment 0
    2010.02.10 15:10

    JQGrid using MVC, Json and Datatable.

    Last couple of days i have been trying to make my sample JQGrid working ASP.NET MVC and DataTable. If you google it with this two terms MVC,JQGrid you will find lot of samples using Linq, but if you work with Databases like Oracle or any other databases which does not have a LINQ provider(atleast at the time of writing this article) your alternate choice is to go with DataSet/DataTable. So i thought of putting this example together to help others who are on the same boat like myself.

    I have given a fully working sample of ASP.NET MVC with JQgrid using Datatable(See below for the download link).

    I am not going to cover the basics of MVC in this article, for which you can refer to other blogs such as this one.

    These are the features i have implemented in this sample,


    • Themes
    • Refresh Grid
    • Server side Paging
    • Sorting
    • JSON based


    I will cover other features of JQGrid in my future articles.

    Here are the steps to get started,

    1. Download JQGrid from here

    2. Create an MVC Application using the Visual Studio 2008 template( if you want a detailed explanation for creating an MVC application VS Template refer here).

    3. Now move the downloaded JQGrid files into the <project>/scripts folders.

    4. Usually with MVC application people tend to put all the themes under Content folder, if you do that here you will have to modify the js files for paging button's images.So i wouldn't recommend moving themes folder.

    4. Open the Site.Master inside <project>/Shared/Site.Master and add links to the following files,
    ../../Scripts/themes/steel/grid.css
    ../../Scripts/themes/jqModal.css
    ../../Scripts/jquery.jqGrid.js
    ../../Scripts/js/jqModal.js
    ../../Scripts/js/jqDnR.js

    5. If you don't like steel themes there 4 other themes( basic,coffee,green and sand) available inside themes folder.

    6. Now you site.master will look similar to this.

    1. <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>  
    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
    3. <html xmlns="http://www.w3.org/1999/xhtml">  
    4. <head runat="server">  
    5.     <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>  
    6.     <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />  
    7.     <script src="/Scripts/jquery-1.3.2.js" type="text/javascript"></script>      
    8.     <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>  
    9.     <link rel="stylesheet" type="text/css" href="../../Scripts/themes/steel/grid.css" title="steel"  
    10.         media="screen" />  
    11.     <link href="../../Scripts/themes/jqModal.css" rel="stylesheet" type="text/css" />  
    12.     <script src="../../Scripts/jquery.jqGrid.js" type="text/javascript"></script>  
    13.     <script src="../../Scripts/js/jqModal.js" type="text/javascript"></script>  
    14.     <script src="../../Scripts/js/jqDnR.js" type="text/javascript"></script>  
    15.       
    16.     <asp:ContentPlaceHolder ID="HeadContent" runat="server" />      
    17. </head>  
    18. <body>  
    19.     <div class="page">  
    20.         <div id="header">  
    21.             <div id="title">  
    22.                 <h1>Sample from arahuman.blogspot.com</h1>  
    23.             </div>  
    24.             <div id="logindisplay">  
    25.                 <% Html.RenderPartial("LogOnUserControl"); %>  
    26.             </div>   
    27.             <div id="menucontainer">  
    28.                 <ul id="menu">                
    29.                     <li><%= Html.ActionLink("Home", "Index", "Home")%></li>  
    30.                     <li><%= Html.ActionLink("About", "About", "Home")%></li>  
    31.                 </ul>  
    32.             </div>  
    33.         </div>  
    34.         <div id="main">  
    35.             <asp:ContentPlaceHolder ID="MainContent" runat="server" />  
    36.             <div id="footer">  
    37.             </div>  
    38.         </div>  
    39.     </div>  
    40. </body>  
    41. </html>  



    7. Create a folder named Helper under the <project>/Helper folder and add the following Helper method to convert a Datatable into the JSON format.

    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Web;  
    5. using System.Data;  
    6. using Newtonsoft.Json;  
    7. using System.Text;  
    8. using System.IO;  
    9.   
    10. namespace JQGridMVCDemo.Helper {  
    11.     public class JsonHelper {  
    12.         public static string JsonForJqgrid(DataTable dt, int pageSize, int totalRecords,int page) {  
    13.             int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);  
    14.             StringBuilder jsonBuilder = new StringBuilder();  
    15.             jsonBuilder.Append("{");  
    16.             jsonBuilder.Append("\"total\":" + totalPages + ",\"page\":" + page + ",\"records\":" + (totalRecords) + ",\"rows\"");  
    17.             jsonBuilder.Append(":[");  
    18.             for (int i = 0; i < dt.Rows.Count; i++) {  
    19.                 jsonBuilder.Append("{\"i\":"+ (i) +",\"cell\":[");  
    20.                 for (int j = 0; j < dt.Columns.Count; j++) {  
    21.                     jsonBuilder.Append("\"");  
    22.                     jsonBuilder.Append(dt.Rows[i][j].ToString());  
    23.                     jsonBuilder.Append("\",");  
    24.                 }  
    25.                 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);  
    26.                 jsonBuilder.Append("]},");  
    27.             }  
    28.             jsonBuilder.Remove(jsonBuilder.Length - 1, 1);  
    29.             jsonBuilder.Append("]");  
    30.             jsonBuilder.Append("}");  
    31.             return jsonBuilder.ToString();  
    32.         }  
    33.     }  
    34. }  



    8. Now open the index page under <project>/SViews/Home/Index.aspx and add the following code,

    1. <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>  
    2. <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">  
    3.     Home Page  
    4. </asp:Content>  
    5. <asp:Content ID="indexContent" ContentPlaceHolderID="HeadContent" runat="server">  
    6.     <script type="text/javascript">  
    7.         jQuery(document).ready(function() {  
    8.             jQuery("#list").jqGrid({  
    9.             url: '/Home/GetGridData/',  
    10.                 datatype: 'json',  
    11.                 mtype: 'GET',  
    12.                 colNames: ['Customer ID', 'Contact Name', 'Address', 'City', 'Postal Code'],  
    13.                 colModel: [  
    14.                   { name: 'CustomerID', index: 'CustomerID', width: 100, align: 'left' },  
    15.                   { name: 'ContactName', index: 'ContactName', width: 150, align: 'left' },  
    16.                   { name: 'Address', index: 'Address', width: 300, align: 'left' },  
    17.                   { name: 'City', index: 'City', width: 150, align: 'left' },  
    18.                   { name: 'PostalCode', index: 'PostalCode', width: 100, align: 'left' }  
    19.                 ],  
    20.                 pager: jQuery('#pager'),  
    21.                 rowNum: 10,  
    22.                 rowList: [5, 10, 20, 50],  
    23.                 sortname: 'CustomerID',  
    24.                 sortorder: "asc",  
    25.                 viewrecords: true,  
    26.                 imgpath: '/scripts/themes/steel/images',  
    27.                 caption: 'Northwind Customer Information'  
    28.             }).navGrid(pager, { edit: false, add: false, del: false, refresh: true, search: false });  
    29.         });  
    30.     </script>  
    31.   
    32. </asp:Content>  
    33. <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">  
    34.     <h2>  
    35.         Customers List</h2>  
    36.     <table id="list" class="scroll" cellpadding="0" cellspacing="0" width="100%">  
    37.     </table>  
    38.     <div id="pager" class="scroll" style="text-align: center;">  
    39.     </div>  
    40. </asp:Content>  



    the id (#list) links the html table with the jquery to inject the grid ui's code at runtime.
    it makes an ajax calls using the url(/Home/GetGridData/) provided.
    datatype: json refers to the output from the above call returns the JSON type results.

    9. Now open the home controller page to add the GetGridDataMethod under <project>/Controller/HomeController.cs. Add the following code to it.

    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Web;  
    5. using System.Web.Mvc;  
    6. using System.Data.SqlClient;  
    7. using System.Configuration;  
    8. using System.Data;  
    9. using JQGridMVCDemo.Helper;  
    10.   
    11. namespace MvcApplication1.Controllers {  
    12.     [HandleError]  
    13.     public class HomeController : Controller {  
    14.         public ActionResult Index() {  
    15.             ViewData["Message"] = "Welcome to ASP.NET MVC!";  
    16.             return View();  
    17.         }  
    18.   
    19.         public ActionResult About() {  
    20.             return View();  
    21.         }  
    22.   
    23.         public ActionResult GetGridData(string sidx, string sord, int page, int rows) {  
    24.             return Content(JsonHelper.JsonForJqgrid(GetDataTable(sidx,sord,page,rows), rows, GetTotalCount(), page), "application/json");  
    25.         }  
    26.   
    27.         public DataTable GetDataTable(string sidx, string sord, int page, int pageSize) {  
    28.             int startIndex = (page-1) * pageSize;  
    29.             int endIndex = page * pageSize;  
    30.             string sql = @"WITH PAGED_CUSTOMERS  AS  
    31.                         (  
    32.                          SELECT  CustomerID, ContactName, Address, City, PostalCode,  
    33.                            ROW_NUMBER() OVER (ORDER BY " + sidx + @" " + sord + @") AS RowNumber  
    34.                          FROM CUSTOMERS  
    35.                         )  
    36.                         SELECT CustomerID, ContactName, Address, City, PostalCode  
    37.                         FROM PAGED_CUSTOMERS  
    38.                         WHERE RowNumber BETWEEN " + startIndex + @" AND " + endIndex + @";";  
    39.                           
    40.             DataTable dt = new DataTable();  
    41.             SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["mainConnection"].ConnectionString);  
    42.             SqlDataAdapter adap = new SqlDataAdapter(sql,conn);  
    43.             var rows=adap.Fill(dt);  
    44.             return dt;  
    45.         }  
    46.   
    47.         public int GetTotalCount() {  
    48.             string sql = @"SELECT COUNT(*) FROM Customers";  
    49.             SqlConnection conn=null;  
    50.             try {  
    51.                  conn= new SqlConnection(ConfigurationManager.ConnectionStrings["mainConnection"].ConnectionString);  
    52.                 SqlCommand comm = new SqlCommand(sql, conn);  
    53.                 conn.Open();  
    54.                 return (int)comm.ExecuteScalar();  
    55.             } catch {  
    56.             } finally {  
    57.                 try {  
    58.                     if (ConnectionState.Closed != conn.State) {  
    59.                         conn.Close();  
    60.                     }  
    61.                 }catch {  
    62.                 }  
    63.             }  
    64.             return -1;  
    65.         }  
    66.     }  
    67. }  




    I have declared four paramters here which will be passed by the JQuery. To help us understand better i have named it same like the JGrid where sidx refers to Sort Index name, sord refers to Sort Direction, page refers to page being invoked and rows refers to rows per page.

    That's it. You can download the fully functional source code here. Enjoy and leave me a comment if you like it.

     

    출처 :ㅣ http://arahuman.blogspot.com/2009/06/jqgrid-using-mvc-json-and-datatable.html

    신고

    '소프트웨어 > C# & ASP.NET' 카테고리의 다른 글

    Xml to Json  (0) 2010.02.18
    JQGrid using MVC, Json and Datatable.  (0) 2010.02.10
    C# 강좌  (0) 2010.01.12
    C# 4.0의 새로운 기능  (0) 2009.12.15
    잉여들을 위한 클래스설계 이야기 2/4  (0) 2009.12.11
    잉여들을 위한 클래스설계 이야기 1/4  (0) 2009.12.11
    Trackback 9 Comment 0


    티스토리 툴바