2013年8月25日 星期日

[ASP.NET]使用JQuery來接收JSON字串

上一篇【使用JQuery來傳遞JSON字串】介紹了如何在前端傳遞JSON物件至後端接收,這篇主要介紹如何從後端組出JSON物件,回傳至前端接收。
接續上一篇範例,我們這篇點查詢後,將使用者的資訊利用JSON.NET組合JSON格式,丟回前端做處理。
.ashx
後端我們一樣用泛型處理常式來處理,有一個我們自行定義的User class,裡面有User的Name,和他所會的Skill,依抓資料的來源取得資料後組成List<string>,只要透過Json.NET的SerializeObject function就可以輕易的將List<Object>轉成Json字串。
image
.aspx
回傳前端console.log來看,會看到一個object的Array,接著只要處理顯示畫面就可以了,非常的容易 !!
image
完整程式碼
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyMVC.WebFrom.Json
{
    /// <summary>
    /// ReturnJsonHandler 的摘要描述
    /// </summary>
    public class ReturnJsonHandler : IHttpHandler
    {

        public class User
        {
            public string UserName { get; set; }
            public List<string> Skill { get; set; }
        }

        public void ProcessRequest(HttpContext context)
        {
            List<User> UserList = GetUser();
            string ReturnString = JsonConvert.SerializeObject(UserList);
            context.Response.Write(ReturnString);
        }

        private List<User> GetUser()
        {
            List<User> UserList = new List<User>();
            
            User User1 = new User();
            User1.UserName = "User1";
            User1.Skill = new List<string>() { "PHP", "ASP.NET" };

            User User2 = new User();
            User2.UserName = "User2";
            User2.Skill = new List<string>() { "JSP", "ASP.NET" };

            UserList.Add(User1);
            UserList.Add(User2);

            return UserList;
        }


        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetJson.aspx.cs" Inherits="MyMVC.WebFrom.Json.GetJson" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="../../Scripts/jquery-1.7.2.min.js"></script>
    <script type="text/javascript">

        $(function () {
            $('#btn_search').click(function () {
                $.ajax({
                    url: 'ReturnJsonHandler.ashx',
                    data: {}, //將陣列轉成Json
                    type: 'GET',
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function (data) {
                        console.log(data);
                        for (var i = 0; i < data.length; i++) {
                            var string = "<div>";
                            string = data[i].UserName+":";
                            for (var k = 0; k < data[i].Skill.length; k++) {
                                string += data[i].Skill[k];
                            }
                            string += "<div/>";
                            $('#UserList').append(string);
                        }
                    }
                });
            });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <input type="button" id="btn_search" value="查詢" />
            <br />
            <div id="UserList">
            </div>
        </div>

    </form>
</body>
</html>

2013年8月20日 星期二

[ASP.NET]使用JQuery來傳遞JSON字串

最近又寫回Webform,但跟以前不一樣的事,很多時候我已經捨去掉那些控制項,也不再使用Update Panel,主要是因為不想再使用那肥大的ViewState,所以我通常會搭配一般的Html標籤,再用熟悉的JQuery來做資料的POST或GET,而JSON字串就常常會使用到,因為最近太常用到了,所以來寫篇文章記錄一下,如何將頁面上的資料組成JSON字串傳到後端(.ashx)。
傳遞JSON字串到後端
只傳遞幾個變數到後端較沒什麼問題,以下示範如何傳遞複雜一點的陣列,如下圖,功能大概是可以新增一個使用者,每個使用者都能勾選他們的技能,並且點儲存後將所有使用者的資料轉成JSON字串傳回後端。
image
我的做法是寫一個Div的Template,並且將他設為隱藏,點選新增時,抓取這個Div的所有Html,複製到另一個ID為UserList的div底下(此方法在資料量多時效率會比較差,此篇為求示範並未做太多防呆)
image
image
接著點選Save時,再去UserList這個div底下抓取所有使用者資料
image
接著只要再把Users這個Array,轉成JSON字串,Ajax丟到後端即可,再送出前我們Console出來看看轉成JSON後的樣子是怎樣
image
image
而後端,我們新增一個名為HandlerJsonString.ashx的泛型,並定義一個與前端相同的物件Users,並使用透過Nuget,安裝Json.NET,來幫我們解析Json字串,至於Json.NET怎麼安裝在此篇就不再多說明,藉由它我們可以很輕易的使用JsonConvert.DeserializeObject語法來轉換JSON字串。
image
image
完整程式碼
.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JquerySendJson.aspx.cs" Inherits="MyMVC.WebFrom.JquerySendJson" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="../Scripts/jquery-1.7.2.min.js"></script>
    <script>
        $(function () {

            //點選新增時,將定義好的div Template抓回,取代掉使用者字串,將Html加入UserList這個div裡面
            $('#btn_add').click(function () {
                var Template = $('.UserTemplate').html().replace('UserName', $('#UserName').val());
                $('#UserList').append(Template);
            });

            //點選儲存
            $('#btn_save').click(function () {
                var Users = new Array();
                //找出UserList裡面的fieldset區塊,抓取使用者資料
                $('#UserList').find('fieldset').each(function () {
                    var self = $(this);
                    var User = new Object();
                    User.skill = new Array();
                    User.UserName = $(self).find('legend').html();
                    //找出所有勾選的技能
                    $(self).find('input[type="checkbox"]:checked').each(function () {
                        User.skill.push($(this).val());
                    });
                    Users.push(User);
                });

                console.log(JSON.stringify(Users));
                $.ajax({
                    url: 'HandlerJsonString.ashx',
                    data: { array: JSON.stringify(Users) }, //將陣列轉成Json
                    type: 'GET',
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function (data) {
                        alert(data);
                    }
                });


            });
        });

    </script>
</head>
<body>
    <form id="form1" runat="server">
        
        <div class="UserTemplate" style="display:none;">
            <fieldset>
                <legend>UserName</legend>
                <input type="checkbox" value="asp" />ASP.NET
                <input type="checkbox" value="php" />PHP
                <input type="checkbox" value="jsp" />JSP
            </fieldset>
        </div>

        <div>
            <input type="text" id="UserName" />
            <input type="button" id="btn_add" value="新增" />
            <input type="button" id="btn_save" value="儲存" />
            <br />
            <div id="UserList">
            </div>

        </div>
    </form>
</body>
</html>

.ashx
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;

namespace MyMVC.WebFrom
{
    /// <summary>
    /// HandlerJsonString 的摘要描述
    /// </summary>
    public class HandlerJsonString : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string array = context.Request.QueryString["array"] ?? string.Empty;
            List<User> _User = JsonConvert.DeserializeObject<List<User>>(array);
            
            //接下來可做寫入DB的動作....

            context.Response.Write("Save!!");
        }

        public class User
        {
            public string UserName { get; set; }
            public List<string> Skill { get; set; }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

Reference

---

JSON.NET

http://www.dotblogs.com.tw/shadow/archive/2011/11/30/60083.aspx

http://blog.darkthread.net/post-2010-06-05-json-net-jobject-example.aspx

2013年7月22日 星期一

[ASP.NET]用TryParseExact將特殊日期格式轉回DateTime

一般日期轉換,我都會用DateTime.TryParse來轉換,但如果不注意的話,會發生日期完全不對或失敗的問題…
日期不對舉凡像有些系統會使用05/07/2013這種格式,心裡想的是七月五號,但轉換後會變成五月七號,另外一種情況就是自訂格式轉換的問題,今天收到客戶送過來的日期格式如下"2013/07/22 @ 20:00:15:4324",如果用DateTime.TryParse就會回傳false,這時就要用DateTime.TryParseExact():
//特殊格式
string DateStr = "2013/07/22 @ 20:00:15:4324";
DateTime _date;

//錯誤的轉換方式,回傳False
if (DateTime.TryParse(DateStr, out _date))
{
    //TryParse轉換成功
}

//正確轉換方式
if(DateTime.TryParseExact(DateStr, "yyyy/MM/dd @ HH:mm:ss:ffff", null, System.Globalization.DateTimeStyles.None, out _date))
{
    //TryParseExact轉換成功
}

Reference

--

MSDN

2013年7月21日 星期日

[CSS]網頁鑲入FLASH卻出現邊框或白線之解決辦法

雖然HTML5越來越火紅,但要所有網頁設計師都去學HTML5捨棄掉FLASH簡直是天方夜譚,所以在實務上,常常會從網頁設計師的版發現又是FLASH,又是Table排版,搞半天還是要程式設計師花時間去調整版面(以上純屬個人經歷小小抱怨…)
之前常發現一個問題,就是FLASH邊邊會出現白線,網頁結構大概如下:
<body>
<form id="form1" runat="server">
    <div>
        <object id="FlashID" width="900" height="675" style="visibility: inherit;">
            <param name="movie" value="flash.swf">
            <param name="quality" value="high">
            <param name="wmode" value="transparent">
            <param name="swfversion" value="11.0.0.0">
            <!-- 此 param 標籤會提示使用 Flash Player 6.0 r65 和更新版本的使用者下載最新版本的 Flash Player。如果您不想讓使用者看到這項提示,請將其刪除。 -->
            <param name="expressinstall" value="../../Content/images/expressInstall.swf">
            <param name="BGCOLOR" value="#2b0001">
            <!-- 下一個物件標籤僅供非 IE 瀏覽器使用。因此,請使用 IECC 將其自 IE 隱藏。 -->
            <!--[if !IE]>-->
            <object type="application/x-shockwave-flash" data="flash.swf" width="900" height="675" style="font-size: 0; line-height: 0;">
                <!--<![endif]-->
                <param name="quality" value="high">
                <param name="wmode" value="transparent">
                <param name="swfversion" value="11.0.0.0">
                <param name="expressinstall" value="../../Content/images/expressInstall.swf">
                <param name="BGCOLOR" value="#2b0001">
                <!-- 瀏覽器會為使用 Flash Player 6.0 和更早版本的使用者顯示下列替代內容。 -->
                <div>
                    <h4>這個頁面上的內容需要較新版本的 Adobe Flash Player。</h4>
                    <p>
                        <a href="http://www.adobe.com/go/getflashplayer">
                            <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="取得 Adobe Flash Player" width="112" height="33"></a>
                    </p>
                </div>
                <!--[if !IE]>-->
            </object>
            <!--<![endif]-->
        </object>
    </div>
    <div style="background-color: yellow;">test</div>
</form>
</body>

第二個div我用背景黃色來區隔,會發現有以下白線(紅色區塊為FLASH區塊,因版權問題故就不呈現了):

image

調了好久,解決方法其實很簡單,只要朝CSS下手即可Q__Q:

object {
     float:none;
     margin:0em 0em 0em 0em;
     display:block;
}

image

Referenece

--

CSS Display屬性介紹

[IDE]在Visual Studtio 2012使用Visual SourceSafe(VSS)進行版本控管

版本控管有很多種,一般.NET開發人員會先想到的是TFS,最近也有很方便的線上版控GitHub,再來可能使用SVN等等,但本公司目前使用的仍是推出很久的Visaul SourceSafe來進行版本控管,不管用什麼都不重要,重要的是不要有人上程式導致系統掛掉,或者是大家版本不同搞成一團亂,能確保程式版本好維護即可,但現在開發工具都已經用到Visual Studtio 2012了,還能用古老的VSS嗎,答案是可以的!在這裡做個小筆記

要使用前,請先確保有安裝VSS Client工具,這樣VS才能偵測的到

首先打開VS 2012 -> 工具 -> 選項

QQ截圖20130721171844

也可以去環境裡面設定一些規則

QQ截圖20130721173338

設定預設的登入ID

QQ截圖20130721173355

接著就可以去開你的專案了,開啟後應該會跳出VSS輸入帳號密碼的畫面:

QQ截圖20130721171938

如果您的專案是網站,請使用

Referenece

--

什麼是VSS

http://www.dwdmbi.com/2012/09/using-vss-2005-with-visual-studio-2012.html

[ASP.NET]產生XML時多出BOM之解決辦法

最近工作上遇到一個需求,大概是產生XML資料,再利用這個資料丟到別的系統,來做資料匯入,但按照spec做出來,對方卻一直說parse有問題,花了好久的時間核對才發現是BOM的問題Q__Q
BOM
位元組順序記號(英語:byte-order mark,BOM)是位於碼點U+FEFF的統一碼字元的名稱。當以UTF-16或UTF-32來將UCS/統一碼字元所組成的字串編碼時,這個字元被用來標示其位元組序。它常被用來當做標示檔案是以UTF-8、UTF-16或UTF-32編碼的記號。資料擷取自維基百科
產生XML的程式如下
XmlDocument doc = new XmlDocument();

XmlDeclaration xmldecl;

//指定為UTF-8
xmldecl = doc.CreateXmlDeclaration("1.0", null, null);
xmldecl.Encoding = "UTF-8";
XmlElement root = doc.DocumentElement;
doc.InsertBefore(xmldecl, root);

//產生XML結構
XmlElement Dept = doc.CreateElement("Dept");
doc.AppendChild(Dept);

XmlElement RD = doc.CreateElement("RD");
Dept.AppendChild(RD);

doc.Save(@"D:\temp.xml");

因輸出的檔案看起來沒什麼問題,格式也都正確,但用二進位編輯器(如何使用二進位編輯器請看此篇)查看後,卻多出了一行亂碼

image

因Save預設會是UTF-8編碼,故我們宣告了兩次BOM的UTF-8,解決方式有以下幾種

將XML使用WriteAllText逐行寫入

File.WriteAllText(@"D:\temp.xml", doc.OuterXml);

或者將XML Save不指定為UTF-8
using (var writer = new XmlTextWriter(@"D:\temp.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}

Referenece

--

http://stackoverflow.com/questions/4942825/xdocument-saving-xml-to-file-without-bom

2013年7月20日 星期六

[IDE]NotePad++新增二進位編輯器模組(Hex Editor)

通常除了開發上使用Visuall Studio外,通常我會一些檔案我會搭配用NotePad++來開啟編輯,最近工作需要有二進位編輯器來看一些檔案,突然發現Notepad++有個模組可以安裝,趕快來分享一下!

版本 6.3.3 v

開啟NotePad++,點選問號

image

點選H分類

image

找到Hex Editor工具

image

下載會來後會是一個ZIP壓縮檔,將裡面的HexEditor放入NotePad++資料夾,預設是C:\Program Files (x86)\Notepad++\plugins

image

接著重啟後,至外掛模組就可以將功能開啟了!!

image