1. 程式人生 > 其它 >Ajax與MVC結合

Ajax與MVC結合

AJAX 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術,是一種在不重新整理頁面的前提下實現前端和後端互動的技術。

在前面的JavaScript和Jquery課程中也有介紹過Ajax技術的應用。

一、Ajax輔助方法

AJax輔助方法:

  • 可以用於建立表單和指向控制器操作方法的連結,但不同的是,它們與伺服器採用的是Ajax(非同步互動)方式.
  • 當使用Ajax輔助方法時,無須編寫任何指令碼程式碼即可實現程式的非同步性。
  • 使用Ajax輔助方法必須先引入jQuery.unobtrusive-ajax.js,此檔案預設包含在ASP.NET MVC應用程式模板中。

Ajax.ActionLink方法:

  • 可以建立一個具有非同步行為的超連結。
  • ActionLink方法的第一個引數是超連結的文字,第二個引數是操作方法的名稱。
  • ActionLink方法可以通過設定AjaxOptions物件的屬性值來調整Ajax請求的行為

AjaxOptions屬性和作用:

屬性 作用
Confirm 獲取或設定提交請求之前,顯示於確認視窗中的訊息。
HttpMethod 獲取或設定 HTTP 請求方法(“GET”或“POST”)。
InsertionMode 獲取或設定指定如何將響應結果插入到目標 DOM 元素的模式。
LoadingElementId 獲取或設定載入時要顯示的 HTML 元素的 id 屬性值。
OnBegin 獲取或設定更新頁面之前呼叫的 JavaScript 函式的名稱。
OnComplete 獲取或設定資料響應之後,更新頁面之前,呼叫的 JavaScript 函式。
OnFailure 獲取或設定頁面更新失敗時呼叫的 JavaScript 函式。
OnSuccess 獲取或設定頁面更新成功之後呼叫的 JavaScript 函式。
UpdateTargetId 獲取或設定要使用伺服器響應來更新的 DOM 元素的 ID。
Url 獲取或設定要向其傳送請求的 URL。

案例一:

使用Ajax.ActionLink實現超級連結,並且點選超級連結之後非同步顯示動態Action內容

超級連結所在Action:

public ActionResult Demo01()
{
	return View();
}

超級連結所在的View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo01</title>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script src="~/Script/Jquery/jquery.unobtrusive-ajax.js"></script>
</head>
<body>
    <h1>
        @*在訪問控制器方法的時候如果需要傳遞引數,可以在AjaxOptions中重新設定訪問url*@
        @Ajax.ActionLink("顯示名單", "Demo01PartialView", new AjaxOptions { UpdateTargetId = "div1", InsertionMode = InsertionMode.Replace, HttpMethod = "Get" }) 
    </h1>
    <div id="div1">        
    </div>
</body>
</html>

動態內容的Action:

public ActionResult Demo01PartialView()
{
    ViewBag.Items = new string[] { "Jimmy", "Susan", "Tomas", "Helen", "Jessica" };
    return View();
}

動態內容的View(沒有html,head,body等html結構程式碼):

<div style="font:bold 20px; color:blue;">
    <ul>
        @foreach (var item in ViewBag.Items)
            {
            <li>@item</li>
        }
    </ul>
</div>

案例二:

使用Ajax.ActionLink實現超級連結,並且點選超級連結之後非同步顯示當前日期

超級連結所在Action:

public ActionResult Demo02()
{
	return View();
}

超級連結所在的View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo02</title>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script src="~/Script/Jquery/jquery.unobtrusive-ajax.js"></script>
</head>
<body>
    <h1>
        @Ajax.ActionLink("獲取當前日期", "Demo02GetDate", new AjaxOptions { UpdateTargetId = "div1", InsertionMode=InsertionMode.Replace, HttpMethod="Post" })
    </h1>
    <div id="div1">
    </div>
</body>
</html>

動態內容的Action:

public ActionResult Demo02GetDate()
{
    string time = DateTime.Now.ToString("yyyy年MM月dd日");
    return Content(time, "text/html");
}

(2)Ajax.BeginForm

案例一:

使用Ajax.BeginForm實現使用者登入表單

登入相關Action:

public ActionResult Demo03()
{
    return View();
}
[HttpPost]
public ActionResult Demo03(string txtAccount,string txtPwd)
{
    string acc = txtAccount;
    string pwd = txtPwd;
    if (acc.Equals("") || pwd.Equals(""))
    {
        return Content("使用者名稱或密碼不能為空", "text/html");
    }
    if (acc.Equals("admin") && pwd.Equals("admin"))
    {
        return Content("<script>window.location.href='Demo03WelCome';</script>", "text/html");
    }
    else
    {
        return Content("使用者名稱或密碼錯誤", "text/html");
    }
}

登入頁面View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo03</title>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script src="~/Script/Jquery/jquery.unobtrusive-ajax.js"></script>
    <style type="text/css">
        div, table, tr, td {margin: 0px;padding: 0px;}
        .myTable {width: 800px;margin: 20px auto;border-collapse: collapse;}
        .myTable td {height: 30px;line-height: 30px;padding: 6px;}
    </style>
</head>
<body>
    @*@using (Ajax.BeginForm("Demo03Login", "Home", new AjaxOptions
    {     
        InsertionMode = InsertionMode.Replace,
        HttpMethod = "post",
        UpdateTargetId = "ErrInfo"
    }))*@
    @using (Ajax.BeginForm(new AjaxOptions
    {
        //InsertionMode = InsertionMode.Replace,
        HttpMethod = "post",
        UpdateTargetId = "ErrInfo"      
    }))
    {
        <div style="text-align:center;">
            <table width="800" class="myTable" border="1">
                <tr>
                    <td colspan="2" align="center" style="font-weight:bold;">使用者登入</td>
                </tr>
                <tr>
                    <td width="200" align="right">使用者名稱:</td>
                    <td width="600" align="left"><input type="text" name="txtAccount" /></td>
                </tr>
                <tr>
                    <td width="200" align="right">密碼:</td>
                    <td width="600" align="left"><input type="password" name="txtPwd" /></td>
                </tr>
                <tr>
                    <td width="200" align="right"></td>
                    <td width="600" align="left">
                        <input type="submit" value="登入" />
                        <span id="ErrInfo"></span>
                    </td>
                </tr>
            </table>
        </div>
    }
</body>
</html>

登入成功之後的Action和VIew:

public ActionResult Demo03WelCome()
{
	return View();
}
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo03WelCome</title>
</head>
<body>
    <div> 
        <h1>歡迎來到*****系統</h1>
    </div>
</body>
</html>

案例二:

使用Ajax.BeginForm實現員工查詢功能

資料表(將資料表生成EF框架內容):

create table Dept
(
	DeptId int primary key identity(1,1),
	DeptName varchar(50) not null
)

create table Employee
(
	EmpId int primary key identity(1,1),
	DeptId int not null,
	EmpName varchar(50) not null,
	EmpPhone varchar(50) not null,
	EmpArea varchar(50) not null,
	EmpSalary decimal(18,2) not null
)

insert into Dept(DeptName) values('開發部')
insert into Dept(DeptName) values('測試部')
insert into Dept(DeptName) values('實施部')

insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'劉德華','13887855552','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'張學友','13556528634','深圳',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'劉亦菲','13448494546','廣州',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'周杰倫','13888666855','北京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'許巍','13868654219','上海',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'孫燕姿','13895133572','成都',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'朴樹','13458788896','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'周潤發','13554588745','南京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'李連杰','13998759654','上海',6500)

select * from Dept
select * from Employee

Action:

public ActionResult Demo04()
{
    return View();
}
[HttpPost]
public ActionResult Demo04PartialView()
{
    DBTESTEntities db = new DBTESTEntities();
    var listEmp = from emp in db.Employee select emp;
    if (!string.IsNullOrEmpty(Request["txtName"]))
    {
        string empName = Request["txtName"].ToString();
        listEmp = listEmp.Where(p => p.EmpName.Contains(empName));
    }
    ViewBag.listEmp = listEmp;
    return View();
}

View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo04</title>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script src="~/Script/Jquery/jquery.unobtrusive-ajax.js"></script>
    <script type="text/javascript">
        function searchFail()
        {
            $("#ajaxResult").html("查詢出錯!");
        }
    </script>
</head>
<body>
    <div>
        @using (Ajax.BeginForm("Demo04PartialView", "Home", new AjaxOptions
        {
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "post",
            OnFailure = "searchFail",
            LoadingElementId = "ajaxLoading",
            UpdateTargetId = "ajaxResult"
        }))
        {
            <input type="text" name="txtName" />
            <input type="submit" value="搜 索" />
            <img id="ajaxLoading" src="~/Img/ajax-loader.gif" style="display:none;" />
        }
    </div>
    <div id="ajaxResult">
        
    </div>
</body>
</html>
<style type="text/css">
    div, table, tr, td {margin: 0px;padding: 0px;}
    .myTable {width: 800px;margin: 20px;border-collapse: collapse;}
    .myTable td, .myTable th {height: 30px;line-height: 30px;padding: 6px;}
</style>
<table width="1000" border="1" class="myTable">
    <tr>
        <th>員工編號</th>
        <th>員工姓名</th>
        <th>員工電話</th>
        <th>所在地區</th>
        <th>員工工資</th>
    </tr>
    @foreach (var item in ViewBag.listEmp)
            {
        <tr>
            <td>@item.EmpId</td>
            <td>@item.EmpName</td>
            <td>@item.EmpPhone</td>
            <td>@item.EmpArea</td>
            <td>@item.EmpSalary.ToString("F2")</td>
        </tr>
    }
</table>

二、Jquery Ajax和MVC結合

以下很多案例中需要資料庫支援,資料表資料如下:

create table Dept
(
	DeptId int primary key identity(1,1),
	DeptName varchar(50) not null
)

create table Employee
(
	EmpId int primary key identity(1,1),
	DeptId int not null,
	EmpName varchar(50) not null,
	EmpPhone varchar(50) not null,
	EmpArea varchar(50) not null,
	EmpSalary decimal(18,2) not null
)

insert into Dept(DeptName) values('開發部')
insert into Dept(DeptName) values('測試部')
insert into Dept(DeptName) values('實施部')

insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'劉德華','13887855552','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'張學友','13556528634','深圳',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'劉亦菲','13448494546','廣州',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'周杰倫','13888666855','北京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'許巍','13868654219','上海',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'孫燕姿','13895133572','成都',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(1,'朴樹','13458788896','武漢',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(2,'周潤發','13554588745','南京',6500)
insert into Employee(DeptId,EmpName,EmpPhone,EmpArea,EmpSalary)
values(3,'李連杰','13998759654','上海',6500)

select * from Dept;
select * from Employee;

一下案例中部分功能可以用到Json處理類,如下:

public class MyJson
{
    #region 將物件轉換為Json(支援實體、集合)
    public static string ToJsJson(object item)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        string output = serializer.Serialize(item);
        return output;
    }
    #endregion

    #region 將Json字串轉換為實體或集合
    public static T FromJsonTo<T>(string jsonString)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        T jsonObject = serializer.Deserialize<T>(jsonString);
        return jsonObject;
    }
    #endregion

    #region 將DataTable轉換成Json字串
    public static string DataTableToJson(DataTable dt)
    {
        StringBuilder jsonBuilder = new StringBuilder();
        //jsonBuilder.Append("{\"");
        //jsonBuilder.Append(dt.TableName.ToString());
        //jsonBuilder.Append("\":[");

        jsonBuilder.Append("[");
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            jsonBuilder.Append("{");
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                jsonBuilder.Append("\"");
                jsonBuilder.Append(dt.Columns[j].ColumnName);
                jsonBuilder.Append("\":\"");
                jsonBuilder.Append(dt.Rows[i][j].ToString());
                jsonBuilder.Append("\",");
            }
            jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            jsonBuilder.Append("},");
        }
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        jsonBuilder.Append("]");

        //jsonBuilder.Append("]");
        //jsonBuilder.Append("}");
        return jsonBuilder.ToString();
    }
    #endregion

    #region 將DataRow轉換成Json資料
    public static string DataRowToJson(DataTable dt)
    {
        StringBuilder jsonBuilder = new StringBuilder();
        jsonBuilder.Append("{");
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            jsonBuilder.Append("\"");
            jsonBuilder.Append(dt.Columns[j].ColumnName);
            jsonBuilder.Append("\":\"");
            jsonBuilder.Append(dt.Rows[0][j].ToString());
            jsonBuilder.Append("\",");
        }
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        jsonBuilder.Append("},");
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        return jsonBuilder.ToString();
    }
    #endregion
}

(1)檢查使用者名稱是否可用

Action:

public ActionResult Demo05()
{
    return View();
}
public ActionResult Demo05Check()
{
    //假設liubei,guanyu,zhangfei三個使用者名稱已經被註冊過
    string acc = Request["acc"].ToString();
    if (acc.Equals(""))
        return Content("使用者名稱不能為空!", "text/html");
    if (acc.Equals("liubei") || acc.Equals("guanyu") || acc.Equals("zhangfei"))
    {
        return Content("使用者名稱已經被註冊!", "text/html");
    }
    else
    {
        return Content("恭喜,使用者名稱可以使用!", "text/html");
    }
}

View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo05</title>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btCheck").click(function () {
                var acc = $("#acc").val();
                $.ajax({
                    type: "POST",
                    url: "Demo05Check",
                    data: { acc: acc },
                    success: function (msg) {
                        $("#spanInfo").html(msg);
                    }
                });
            })
        })
    </script>
</head>
<body>
    <div> 
        <h1>使用者名稱驗證</h1>
        <form method="post">
            使用者名稱:<input type="text" name="acc" id="acc" />
            <input type="button" value="驗證" id="btCheck" />
            <span id="spanInfo" style="color:red;"></span>
        </form>
    </div>
</body>
</html>

(2)查詢資料列表

Action:

public ActionResult Demo06()
{
    return View();
}
//使用JsonResult返回查詢資料(不需要Json工具類)
public JsonResult Demo06Search()
{
    DBTESTEntities db = new DBTESTEntities();
    var listView = from emp in db.Employee
                    join dept in db.Dept on emp.DeptId equals dept.DeptId
                    select new
                    {
                        EmpId = emp.EmpId,
                        DeptId = emp.DeptId,
                        DeptName = dept.DeptName,
                        EmpName = emp.EmpName,
                        EmpPhone = emp.EmpPhone,
                        EmpArea = emp.EmpArea,
                        EmpSalary = emp.EmpSalary
                    };
    if (!string.IsNullOrEmpty(Request["txtName"]))
    {
        //linq to entity,不能在lambda裡面進行int.parse,或者其它的顯示隱式的轉換
        string txtName = Request["txtName"].ToString();
        listView = listView.Where(p => p.EmpName.Contains(txtName));
    }
    return Json(listView, JsonRequestBehavior.AllowGet);
}

View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo06</title>
    <style type="text/css">
        div, table, tr, td { margin: 0px; padding: 0px;}
        .myTable { width: 800px;margin: 20px; border-collapse: collapse; }
        .myTable td, .myTable th {height: 30px;line-height: 30px; padding: 6px; }
    </style>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script type="text/javascript">
        function ShowTable(arrJson) {
            var strTable = "<table width='1000' border='1' id='myTable' class='myTable'>";
            strTable += "<tr><th>員工編號</th><th>員工姓名</th><th>部門名稱</th><th>員工電話</th><th>所在地區</th><th>員工工資</th></tr>";
            for (var i = 0; i < arrJson.length; i++) {
                strTable += "<tr>";
                strTable += "<td>" + arrJson[i].EmpId + "</td>";
                strTable += "<td>" + arrJson[i].EmpName + "</td>";
                strTable += "<td>" + arrJson[i].DeptName + "</td>";
                strTable += "<td>" + arrJson[i].EmpPhone + "</td>";
                strTable += "<td>" + arrJson[i].EmpArea + "</td>";
                strTable += "<td>" + arrJson[i].EmpSalary + "</td>";
                //strTable += "<td><a href='javascript:void(0);' class='myedit' id='edit_" + arrJson[i].StuId + "'>編輯</a> <a href='javascript:void(0);' class='mydel' id='del_" + arrJson[i].StuId + "'>刪除</a></td>";
                strTable += "</tr>";
            }
            strTable += "</table>";
            $("#divResult").html(strTable);
        }
        $(function () {
            
            $("#selectEmp").click(function () {
                var txtName = $("#txtName").val();
                //使用getJson獲取資料
                //$.getJSON("Demo06Search", { txtName: txtName }, function (arrJson) {
                //    ShowTable(arrJson);
                //});

                //使用ajax獲取資料
                $.ajax({
                    type: "POST",
                    url: "Demo06Search",
                    data: { txtName: txtName },
                    success: function (arrJson) {
                        ShowTable(arrJson);
                    },
                    dataType:"json"
                });

                //使用post獲取資料
                //$.post("Demo06Search", { txtName: txtName },
                //    function (arrJson) {
                //        ShowTable(arrJson);
                //    },
                //    "json"
                //);

            })
        })
    </script>
</head>
<body>
    <div>
        <input type="text" name="txtName" id="txtName" />
        <input id="selectEmp" type="button" value="搜 索" />
    </div>
    <div id="divResult">

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

(3)返回多個表資料

組合類:

public class DeptAndEmp
{
    public List<Dept> ListDept { get; set; }
    public List<Employee> ListEmp { get; set; }
}

Action:

public ActionResult Demo07()
{
    return View();
}

public ActionResult Demo07Search()
{
    DBTESTEntities db = new DBTESTEntities();
    var listDept = from dept in db.Dept select dept;
    var listEmp = from emp in db.Employee select emp;

    DeptAndEmp deptEmp = new DeptAndEmp();
    deptEmp.ListDept = listDept.ToList();
    deptEmp.ListEmp = listEmp.ToList();

    //方案一: 使用工具類返回資料
    //string jsonResult = MyJson.ToJsJson(deptEmp);
    //return Content(jsonResult);

    //方案二:使用Json.NET - Newtonsoft,第三方工具返回資料
    //string jsonResult = JsonConvert.SerializeObject(deptEmp);
    //return Content(jsonResult);

    //方案三:使用MVC中Json進行返回資料
    return Json(deptEmp, JsonRequestBehavior.AllowGet);
}

View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo07</title>
    <style type="text/css">
        div, table, tr, td {margin: 0px;padding: 0px;}
        .myTable {width: 800px;margin: 20px;border-collapse: collapse;}
        .myTable td, .myTable th {height: 30px;line-height: 30px;padding: 6px;}
    </style>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script type="text/javascript">
        function ShowDept(arrJson) {
            var strTable = "<table width='1000' border='1' id='myTable' class='myTable'>";
            strTable += "<tr><th>部門編號</th><th>部門名稱</th>";
            for (var i = 0; i < arrJson.ListDept.length; i++) {
                strTable += "<tr>";
                strTable += "<td>" + arrJson.ListDept[i].DeptId + "</td>";
                strTable += "<td>" + arrJson.ListDept[i].DeptName + "</td>";
                strTable += "</tr>";
            }
            strTable += "</table>";
            $("#divDept").html(strTable);
        }
        function ShowEmp(arrJson)
        {
            var strTable = "<table width='1000' border='1' id='myTable' class='myTable'>";
            strTable += "<tr><th>員工編號</th><th>員工姓名</th><th>部門編號</th><th>員工電話</th><th>所在地區</th><th>員工工資</th></tr>";
            for (var i = 0; i < arrJson.ListEmp.length; i++) {
                strTable += "<tr>";
                strTable += "<td>" + arrJson.ListEmp[i].EmpId + "</td>";
                strTable += "<td>" + arrJson.ListEmp[i].EmpName + "</td>";
                strTable += "<td>" + arrJson.ListEmp[i].DeptId + "</td>";
                strTable += "<td>" + arrJson.ListEmp[i].EmpPhone + "</td>";
                strTable += "<td>" + arrJson.ListEmp[i].EmpArea + "</td>";
                strTable += "<td>" + arrJson.ListEmp[i].EmpSalary + "</td>";
                //strTable += "<td><a href='javascript:void(0);' class='myedit' id='edit_" + arrJson[i].StuId + "'>編輯</a> <a href='javascript:void(0);' class='mydel' id='del_" + arrJson[i].StuId + "'>刪除</a></td>";

                strTable += "</tr>";
            }
            strTable += "</table>";
            $("#divEmp").html(strTable);
        }

        $(function () {
            //使用ajax獲取資料
            $.ajax({
                type: "POST",
                url: "Demo07Search",
                //data: { txtName: txtName },
                success: function (arrJson) {
                    ShowDept(arrJson);
                    ShowEmp(arrJson);
                },
                dataType: "json"
            });
        })

    </script>
</head>
<body>
    <div id="divDept">

    </div>
    <br /><br />
    <div id="divEmp">

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

(4)自定義Json格式

Action:

public ActionResult Demo08()
{
    return View();
}
public ActionResult Demo08Search()
{
    //完全自定義Json格式
    DBTESTEntities db = new DBTESTEntities();
    var listDept = from dept in db.Dept select dept;
    var listEmp = from emp in db.Employee select emp;
    JArray jArrDept = new JArray();
    foreach (var item in listDept)
    {
        JObject obj = new JObject();
        obj.Add("DeptId", item.DeptId);
        obj.Add("DeptName", item.DeptName);
        jArrDept.Add(obj);
    }
    JArray jArrEmp = new JArray();
    foreach (var item in listEmp)
    {
        JObject obj = new JObject();
        obj.Add("EmpId", item.EmpId);
        obj.Add("DeptId", item.DeptId);
        obj.Add("EmpName", item.EmpName);
        obj.Add("EmpPhone", item.EmpPhone);
        obj.Add("EmpArea", item.EmpArea);
        obj.Add("EmpSalary", item.EmpSalary);
        jArrEmp.Add(obj);
    }
    JObject jObj = new JObject();
    jObj.Add("Dept", jArrDept);
    jObj.Add("Emp", jArrEmp);
    string jsonResult = JsonConvert.SerializeObject(jObj);
    return Content(jsonResult);
	
    //部分自定義Json格式
    //DBTESTEntities db = new DBTESTEntities();
    //var listDept = from dept in db.Dept select dept;
    //var listEmp = from emp in db.Employee select emp;
    //JObject jObj = new JObject();
    ////jObj.Add("Dept", (JArray)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(listDept)));
    ////jObj.Add("Emp", (JArray)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(listEmp)));
    //jObj.Add("Dept", JArray.Parse(JsonConvert.SerializeObject(listDept)));
    //jObj.Add("Emp", JArray.Parse(JsonConvert.SerializeObject(listEmp)));
    //string jsonResult = JsonConvert.SerializeObject(jObj);
    //return Content(jsonResult);
}

View:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Demo08</title>
    <style type="text/css">
        div, table, tr, td { margin: 0px; padding: 0px; }
        .myTable { width: 800px; margin: 20px; border-collapse: collapse;}
        .myTable td, .myTable th {height: 30px;line-height: 30px; padding: 6px;}
    </style>
    <script src="~/Script/Jquery/jquery-1.7.1.js"></script>
    <script type="text/javascript">
        function ShowDept(arrJson) {
            var strTable = "<table width='1000' border='1' id='myTable' class='myTable'>";
            strTable += "<tr><th>部門編號</th><th>部門名稱</th>";
            for (var i = 0; i < arrJson.Dept.length; i++) {
                strTable += "<tr>";
                strTable += "<td>" + arrJson.Dept[i].DeptId + "</td>";
                strTable += "<td>" + arrJson.Dept[i].DeptName + "</td>";
                strTable += "</tr>";
            }
            strTable += "</table>";
            $("#divDept").html(strTable);
        }
        function ShowEmp(arrJson)
        {
            var strTable = "<table width='1000' border='1' id='myTable' class='myTable'>";
            strTable += "<tr><th>員工編號</th><th>員工姓名</th><th>部門編號</th><th>員工電話</th><th>所在地區</th><th>員工工資</th></tr>";
            for (var i = 0; i < arrJson.Emp.length; i++) {
                strTable += "<tr>";
                strTable += "<td>" + arrJson.Emp[i].EmpId + "</td>";
                strTable += "<td>" + arrJson.Emp[i].EmpName + "</td>";
                strTable += "<td>" + arrJson.Emp[i].DeptId + "</td>";
                strTable += "<td>" + arrJson.Emp[i].EmpPhone + "</td>";
                strTable += "<td>" + arrJson.Emp[i].EmpArea + "</td>";
                strTable += "<td>" + arrJson.Emp[i].EmpSalary + "</td>";
                //strTable += "<td><a href='javascript:void(0);' class='myedit' id='edit_" + arrJson[i].StuId + "'>編輯</a> <a href='javascript:void(0);' class='mydel' id='del_" + arrJson[i].StuId + "'>刪除</a></td>";

                strTable += "</tr>";
            }
            strTable += "</table>";
            $("#divEmp").html(strTable);
        }

        $(function () {
            //使用ajax獲取資料
            $.ajax({
                type: "POST",
                url: "Demo08Search",
                //data: { txtName: txtName },
                success: function (arrJson) {
                    ShowDept(arrJson);
                    ShowEmp(arrJson);
                },
                dataType: "json"
            });
        })
        
    </script>
</head>
<body>
    <div id="divDept">

    </div>
    <br /><br />
    <div id="divEmp">

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