1. 程式人生 > >MVC學習筆記之使用JQuery方式傳送Ajax請求呼叫後臺Controller

MVC學習筆記之使用JQuery方式傳送Ajax請求呼叫後臺Controller

通常情況下在MVC模式中我們會採用使用controller獲取業務資料(model)並將業務資料提交給view,或者由view傳遞資料給controller,再由controller更新model。在一些簡單的頁面中可以直接使用Model-->action-->View方式,但如果頁面較為複雜包含多個model及多個分部頁面時為了實現頁面資料的區域性重新整理就需要使用ajax特性,為此需要學習如何使用JQuery獲取頁面資料,並通過ajax傳送請求後臺controller,並返回不同型別的result。

先介紹一個簡單的實用例項,例項實現通過訪問使用者組檢視選擇的使用者組下的所屬使用者,本例項將建立一個treeview,通過選擇節點呼叫後臺資料返回該節點的使用者資訊。

本例項略過EF過程,先看Controller

[HttpPost]
        public JsonResult GetGroup()
        {
            var result = T_GROUPService.GetT_GROUPAllList();
           JsTreeModel rootNode = new JsTreeModel();
           PopulateTree(null, (List<T_GROUP>)result.AppendData, rootNode);
           return Json(rootNode);
            
        }
      public void PopulateTree(string id, List<T_GROUP> list, JsTreeModel node)
      {
          if (node == null)
              node = new JsTreeModel();
          foreach(var u in list.Where(p=>Equals(p.PARENTID,id)).OrderBy(o=>o.NORDER))
          {
              JsTreeModel node1 = new JsTreeModel();
              node1.id = u.ID;
              node1.grouptype = u.GROUPTYPE;
              node1.text = u.GROUPNAME;
              node.nodes.Add(node1);
              PopulateTree(u.ID, list, node1);
          }
      }
public class JsTreeModel
    {
        public string id;
        public string grouptype;
        public string text;
        public List<JsTreeModel> nodes = new List<JsTreeModel>();
    }


此方法通過獲取group資料生成json格式樹返回給view,過程很簡單,不多解釋,直接看View
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <link href="~/Content/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/bootstrap-treeview.css" rel="stylesheet" />
    <script src="@Url.StaticFile("~/Scripts/jquery-1.10.2.js")"></script>
    <script src="@Url.StaticFile("~/Scripts/bootstrap.js")"></script>
    <script src="@Url.StaticFile("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
    <script src="@Url.StaticFile("~/Scripts/bootstrap-treeview.js")"></script>
   

</head>
由於用到了bootstrap-treeview,所以先新增相關引用,本例項是簡單例項並未使用佈局頁,bootstrap-treeview資料格式如下
var tree = [
  {
    text: "Parent 1",
    nodes: [
      {
        text: "Child 1",
        nodes: [
          {
            text: "Grandchild 1"
          },
          {
            text: "Grandchild 2"
          }
        ]
      },
      {
        text: "Child 2"
      }
    ]
  },
  {
    text: "Parent 2"
  },
  {
    text: "Parent 3"
  },
  {
    text: "Parent 4"
  },
  {
    text: "Parent 5"
  }
];  
由此可以看出此資料格式是一個json格式的一個數組物件,那麼對應我們需要提供的資料也必須是json格式的陣列物件,這裡要注意上面我們的GetGroup方法返回的是一個json格式的物件例項而非陣列,我在走了很多彎路才發現居然和bootstrap-treeview要求的型別不一致。再來看看bootstrap-treeview的呼叫方法。
function getTree() {
    // Some logic to retrieve, or generate tree structure
    return data;
}
 
$('#tree').treeview({data: getTree()});     
好了,基本的呼叫方法和資料格式知道了後開始我們的view設計
<div class="row">
            <div id="tree" class="col-sm-4">

            </div>
            <div id="user" class="col-sm-8">
                
            </div>
        </div>
定義一個treeview的div和一個顯示user的div,下面開始編寫指令碼,首先看看獲取樹的方法
function getTree() {
            var tree ;
            $.ajax({
                type: 'POST',
                url: "/Auth/GroupManager/GetGroup",
                dataType: 'json',
                async:false,
                success: function (responseData) {
                    tree= responseData.nodes;
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {//請求失敗處理函式
                    console.log("請求失敗,無法獲取分組資料");
                }
            });
            return tree;
            
        }

        $('#tree').treeview({
            data: getTree(),
            nodeIcon: "glyphicon glyphicon-user",
            backColor: "#FFFFFF"
        });

$('#tree')獲取id為tree的div,然後指定treeview下的各屬性 ,其中data屬性使用了一個方法getTree進行呼叫獲取資料

在getTree方法中使用ajax呼叫後臺名為 GroupManager的controller下的名為GetGroup的action(即上面的方法注意指定了post標記),資料型別datatype則指定為‘json’型別,此處採用的 是同步模式,即設定async:false。下面是如果呼叫成功則執行success中指定的回撥函式,此函式的引數即是返回的結果,由於我們前面返回的是一個json物件,所以將此物件下的所有節點作為陣列返回給treeview。如果呼叫失敗則執行error中指定的回撥函式,其中XMLHttpRequest可檢視具體的錯誤資訊,供除錯使用。

到此一個使用者組的樹檢視即完成,下面將實現點選節點查詢節點下的使用者,同樣是使用jquery的ajax方式傳送請求,然後通過載入一個分部檢視來替換名為user的div物件。

先看看分部檢視

@model IEnumerable<URS.Data.Contract.T_USER>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.SFZHM)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PASSWORD)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SSDW)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.XM)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.SFZHM)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PASSWORD)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.SSDW)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.XM)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        </td>
    </tr>
}

</table>
一個很簡單的分部檢視,Model使用的是列表,再來看看呼叫該分部檢視的action
[HttpPost]
        public ActionResult GetUserByGroupID(string groupID)
        {
            var result = this.T_USERService.T_USERRepository.Entities.Include("Group").Where(p => Equals(p.Group.ID, groupID));
            //return Json(result.AppendData);
            return PartialView("GetUserList", result);
        }
同樣也是很簡單的一個查詢,使用了一個groupID的引數,這樣就需要我們在ajax請求時傳遞一個group的id
$('#tree').on('nodeSelected', function (event, node) {
            var guid = node.id;
            $.ajax({
                type: 'POST',
                url: "/Auth/UserManager/GetUserByGroupID",
                data:{groupID:guid},
                dataType: 'html',
                async: false,
                success: function (responseData) {
                    $('#user').html(responseData);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {//請求失敗處理函式
                    console.log("請求失敗,無法獲取分組資料");
                }
            });
            
        });
呼叫方法使用的是jquery方式,事件nodeSelected,繫結的回撥函式有兩個引數,其中第二個引數即是點選的node物件,可以很容易取得該物件的屬性值。下面看看ajax的請求:和上面請求有所不同的是需要加入一個引數,即data屬性,同樣也是以json格式進行傳遞,另外由於返回的是分部頁面,所以返回的資料型別datatype為html,呼叫成功回撥方法中將實現用返回值替換名為user的div物件。看看結果:



整個應用非常簡單,其邏輯也很簡單,重點實現了由以jquery方式傳送ajax請求到後臺的controller來執行,此例項提供了一種傳送請求返回Json資料的實現過程,同時提供了一種解決如何傳遞頁面資料到後臺並返回頁面的解決辦法。此方法不同於我們簡單的在controller中通過action返回view的方式,個人認為這種方法更據代表性,實現更靈活,同時充分利用了ajax的特性實現了局部資料的重新整理。當然microsft也提供了一些ajaxhelper方法實現ajax的呼叫,今後有空再研究吧。

示例很簡單,但卻提供我們常用的業務模型的一種解決方案,作為新手如果沒接觸過jquery,ajax,mvc的話,那麼此例項還是很有參考價值。

相關推薦

MVC學習筆記使用JQuery方式傳送Ajax請求呼叫後臺Controller

通常情況下在MVC模式中我們會採用使用controller獲取業務資料(model)並將業務資料提交給view,或者由view傳遞資料給controller,再由controller更新model。在一些簡單的頁面中可以直接使用Model-->action-->

鋒利的JQuery學習筆記JQuery

function 效率 back 一點 ie6 容易 服務器端 pre loading   今天終於看到了最令我興奮的一章:JQuery與Ajax的應用。AJAX即“Asynchronous JavaScript and XML”(異步JavaScript和XML),

鋒利的jQuery學習筆記jQuery選擇器

空格 attr 簡單 cap 字符串 check disable select file 在介紹jQuery選擇器之前,先簡單介紹一下CSS選擇器---> 一、CSS選擇器 常見的CSS選擇器有以下幾種: 選擇器 語法 描述 示例 標簽選擇器 E{CSS規則

jquery的get方式傳送AJAX請求

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content='text/html;charset=utf-8'> 5

jquery的post方式傳送AJAX請求

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content='text/html;charset=utf-8'> 5

jqueryajax方式傳送AJAX請求

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content="text/html;charset=utf-8" > 5

ExtJS5.1學習筆記9——Ext中的Ajax請求

下面的程式碼展示了在Ext中使用Ajax的方法: 首先是html檔案的程式碼: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- 下面是三個必

頁面通過jquery上的ajax請求後臺通過POI匯出Excel的問題

POI匯出Excel,後臺程式碼已經完成,我單元測試成功匯出,但是我在頁面用ajax請求匯出檔案就不行,後臺程式碼執行完了,就是沒檔案匯出。這個問題困擾了我很長一段時間,事實上ajax獲取不到返回的檔

jquery如何通過ajax請求獲取後臺資料顯示在表格上

1.引入bootstrap和jquery的cdn <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bo

jQuery學習筆記ajax

先看一個例子: function chageDistrict(obj){ var districtArray = obj.id.split('_'); var homeOrCompany = di

Linux學習筆記1——文件和目錄管理(硬連接和軟連接)(連結檔,相當於快捷方式

class 學習linux lock 訪問 接下來 所有 sdn ext test 在這節將要學習linux的連接檔,在之前用"ls -l" 查看文件屬性的命令時, 其中第二個屬性是連接數。那麽這個連接數是幹什麽的?這就要理解inode。 先說一下文件是怎麽存儲的。

jquery Select2 學習筆記中文提示 - CSDN部落格

首先學習這個東西呢,還是看官網比較全面 select2官網例子   要select2中文顯示:必須要引入中文包,且一定要放在select2.js之後   [javascript]  view plain  copy

Linux學習筆記1——檔案和目錄管理(硬連線和軟連線)(連結檔,相當於快捷方式

在這節將要學習linux的連線檔,在之前用"ls -l" 檢視檔案屬性的命令時, 其中第二個屬性是連線數。那麼這個連線數是幹什麼的?這就要理解inode。     先說一下檔案是怎麼儲存的。檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(Sector),每個扇區儲存512位元

Java Web 學習筆記十二:JBoss RestEasy處理跨域OPTIONS請求方式

跨域請求問題 前提 前後端分離的B/S架構系統 前後端獨立開發,後端採用JBoss restEasy 框架搭建restful服務 後端程式碼開發完成並且部署在某一臺測試機上 前端開發過程中,需

Ajax基礎學習筆記三—jQuery實現Ajax

1、  jQuery對Ajax操作進行封裝:           最底層採用的方法是:$.ajax();           第二層是load(),$.get(),$.post();           第三次是$.getScript()和$.getJSON(). 2、 

Spring MVC學習筆記3,三種對映方式得到Handler

這篇部落格寫的是通過三種方式對映得到Handler 第一種:配置HandlerMapping,根據beanname進行查詢: 配置如下: <form action="hello.do">         hello:<input type="text"

STM32學習筆記ADC--DMA方式

}/*************************************************函式: void DMA_Config(void)功能: DMA配置 引數: 無返回: 無**************************************************/void DMA

jquery學習筆記事件繫結on與事件解綁off用法

on()的多事件繫結 之前學的滑鼠事件,表單事件與鍵盤事件都有個特點,就是直接給元素繫結一個處理函式,所有這類事件都是屬於快捷處理。翻開原始碼其實可以看到,所有的快捷事件在底層的處理都是通過一個”on”方法來實現的。jQuery on()方法是官方推

學習筆記qt4程式中引入自定義視窗部件多繼承方式

      多繼承中,需要從標準的 QWidget類和Qt designer繪製的介面類繼承。這樣,繼承自qt標準的視窗部件類和介面類的子類就可以直接訪問其父類的公有成員和保護成員。 1、用qt creator建立一個名為mulinherit的empty qt projec

jQuery學習筆記事件

事件物件     target  這個反應觸發事件的DOM物件,可以在事件冒泡的時候判斷是否是事件源頭(compare event.target to this)獲取繫結事件的DOM元素(觸發元素),你點了那個就是那個     currentTarget:冒泡前的當前觸發事