本文章是由機器翻譯。

RIA 架構

建置資料中心的 Web 應用程式使用 ASP。NET MVC 和 Ext JS

阿爾卡洛斯一 Olamendy

下載程式碼範例

豐富的網際網路應用程式 (RIA) 結合桌面應用程式的可用性與 Web 為基礎的部署和修訂的彈性。有兩個索引鍵的方式建置 Ria。首先,是瀏覽器外掛? 式裝載執行環境,例如 Flash、 Java 還是在 Silverlight。第二,有 JavaScript 架構延伸程式庫,如 Dojo、 Ext JS、 jQuery,MooTools、 原型和 YUI。各方式皆有其優點與缺點。

JavaScript 程式庫是建置 Ria 因為 JavaScript 的所有主要瀏覽器支援,而且不需要安裝外掛程式或執行階段環境的熱門選擇。我已經與另一個程式庫所提到的實驗 — Ext JS — 但我已經發現它會使一個有趣的選擇實作的 Web 應用程式。是容易實作,已詳細制訂,,與 Selenium 相容的測試。「 Ext 」 JS 也提供預先定義的控制項,可簡化建立 Web 應用程式的 UI。

不幸的是,大部分的 「 ext 」 JS 範例說明 PHP、 Python 與 (並列文字) 對伺服器端的滑軌程式碼。但這並不表示使用 Microsoft 技術的開發人員無法利用 Ext JS。雖然很難 (受限於封裝 Web 要求-回應性質,以提供可設定狀態控制項為基礎的模型的抽象層) 的 Web Form 開發與整合 Ext JS,您可以使用 ASP。NET MVC framework,讓您可以運用這兩種 Microsoft。NET Framework 和在相同的應用程式中的 「 ext 」 JS。

在本文中我將提供我找不到,逐步解說開發的真實世界 Web 方案使用 ASP 教學課程。NET MVC 和 Ext JS 讀取和寫入到後端資料庫。

「 Ext 」 JS 表單基本概念

若要使用 「 ext 」 JS,您必須先從 sencha.com.(我使用版本 3.2.1,但您應該擷取的最新版本)。請注意 「 ext 」 JS 免費,開放原始碼版本可供開放原始碼專案、 非營利機構及教育性使用。讓其他人使用您可能需要購買授權。請參閱 sencha.com/products/license.php 如需詳細資訊。

在您的檔案系統中解壓縮到一個目錄下載。它包含所有您需要開發 Web 方案,尤其是使用 「 ext 」 JS,主要檔案 「 ext 」 all.js。(有是也可以協助您更輕鬆地尋找錯誤偵錯版本)。相依性、 文件和範例程式碼會包含所有的下載中。

專案所需的資料夾是 \adapters 和 \resources。介面卡] 資料夾可讓其他程式庫與 「 ext 」 JS 一起使用。[資源] 資料夾包含這類的 CSS 及影像的相依性。

若要正確地使用 「 ext 」 JS,您也必須在您的網頁中包含三個金鑰檔參考:

ext-3.2.1/adapter/ext/ext-base.js
ext-3.2.1/ext-all.js
ext-3.2.1/resources/css/ext-all.css

「 Ext 」 base.js 檔案中包含 「 ext 」 JS 的核心功能。 Widget 定義包含在 「 ext 」-all.js,並且 「 ext 」 all.css 包含 widget 的樣式表。

讓我們開始使用靜態 HTML 網頁中的 「 ext 」 JS 說明基本概念。 下列幾行包含於頁面的標題區段中,連結所需的檔案,若要成功地發展 (也包括了從 「 ext 」 JS 下載一些範例 widget JavaScript 模組) Ext JS 解決方案:

<link rel="stylesheet" type="text/css" 
  href="ext-3.2.1/resources/css/ext-all.css" />
<script type="text/javascript" language="javascript" 
  src="ext-3.2.1/adapter/ext/ext-base.js"></script>
<script type="text/javascript" language="javascript" 
  src="ext-3.2.1/ext-all.js"></script>
<script type="text/javascript" language="javascript" 
  src="extjs-example.js"></script>

主體中的檔案,我要插入的 div 項目呈現主要 Ext JS 表單:

<div id="frame">
</div>

Extjs example.js 檔會提供一些見解如何建構 Ext JS 應用程式。 任何 「 ext 」 JS 應用程式範本使用分機 ns、 Ext.BLANK_IMAGE_URL 和 Ext.onReady 陳述式:

Ext.ns('formextjs.tutorial');
Ext.BLANK_IMAGE_URL = 'ext-3.2.1/resources/images/default/s.gif';
formextjs.tutorial.FormTutorial = {
  ...
}
Ext.onReady(formextjs.tutorial.FormTutorial.init, 
  formextjs.tutorial.FormTutorial);

分機 ns 陳述式可讓您以邏輯方式組織您的程式碼在命名空間,以避免命名衝突,並設定問題的範圍。

Ext.BLANK_IMAGE_URL 陳述式是很重要的呈現 widget。 它具有稱為空格字元圖像 (透明 1 x 1 像素影像),主要是用來產生同樣的空白區域以放置圖示和分隔符號。

Ext.onReady 陳述式是第一種方法來定義 「 ext 」 JS 程式碼。 一旦該 DOM 是完全載入,保證您可能會參考每個 HTML 項目時,使用指令碼來執行,會自動呼叫這個方法。 如果是 extjs-example.js,以下是指令碼本身:

formextjs.tutorial.FormTutorial = {
  init: function () {
    this.form = new Ext.FormPanel({
      title: 'Getting started form',
      renderTo: 'frame',
      width: 400,
      url: 'remoteurl',
      defaults: { xtype: 'textfield' },
      bodyStyle: 'padding: 10px',
      html: 'This form is empty!'
    });
  }
}

Ext.FormPanel 建立做為欄位的容器類別的執行個體。 RenderTo 屬性指向 div 項目會呈現表單。 [預設值] 屬性會指定預設元件類型表單上。 「 Url 」 屬性指定的 URI 來傳送表單的要求。 最後,html 屬性會指定 (以任何 HTML 格式) 的文字做為預設輸出。

若要新增欄位,您需要的項目屬性以取代 html 屬性:

items: [ nameTextField, ageNumberField ]

若要新增的前兩個項目是一個文字欄位和數字] 欄位:

var nameTextField = new Ext.form.TextField({
  fieldLabel: 'Name',
  emptyText: 'Please, enter a name',
  name: 'name'
});
var ageNumberField = new Ext.form.NumberField({
  fieldLabel: 'Age',
  value: '25',
  name: 'age'
});

必要的屬性為: (若要設定的描述性訊息伴隨的表單的元件) 的 fieldLabel 屬性和名稱屬性來設定要求參數的名稱)。 EmptyText 屬性定義的欄位會包含空白時的浮水印文字。 控制項的預設值為 [值] 屬性。

若要宣告控制項的另一個方法是即時:

items: [
  { fieldLabel: 'Name', emptyText: 'Please, enter a name', name: 'name' },
  { xtype: 'numberfield', fieldLabel: 'Age', value: '25', name: 'age' }
]

如您所見,[名稱] 欄位為您沒有指定的型別,因為它來自表單的預設屬性。

我會將一些額外的項目新增到表單中,最後看像 圖 1

圖 1已完成的表單

截至目前為止,您建立用於 Ext JS 從使用者取得資料的表單。現在,我們將資料傳送到伺服器。您要新增按鈕來送出的過程,並顯示結果給使用者,如所示 圖 2

圖 2表單按鈕

buttons: [{
  text: 'Save', 
  handler: function () {
    form.getForm().submit({
      success: function (form, action) {
        Ext.Msg.alert('Success', 'ok');
      },
      failure: function (form, action) {
        Ext.Msg.alert('Failure', action.result.error);
      }
    });
  }
},
{
  text: 'Reset',
  handler: function () {
    form.getForm().reset();
  }
}]

[按鈕] 屬性可讓表單,以管理所有可能的動作。每個按鈕的名稱和處理常式的屬性。這個處理常式屬性包含在按鈕上執行的動作相關聯的邏輯。在這種情況下,有兩個按鈕的名稱是儲存,重設。儲存檔案] 按鈕處理常式會在表單上執行送出動作,並顯示訊息,指出成功或失敗。重設] 按鈕處理常式會重設表單上的欄位值。

最後一個,但重要 — 表單建立步驟,是驗證。若要指定必要的欄位,我們需要將 allowBlank 屬性設定為 false 而 blankText 屬性設定為必要的驗證失敗時顯示錯誤訊息。例如,以下是表單的 [名稱] 欄位:

{ fieldLabel: 'Name', emptyText: 'Please, enter a name', name: 'name', allowBlank: false }

當您執行應用程式,並按 [儲存] 按鈕,而不在 [名稱] 和 [年齡] 欄位中輸入任何資料時,然後您會收到錯誤訊息,並需要的欄位會以紅色底線。

若要自訂的錯誤訊息的欄位,新增下列各行程式正下方的 Ext.onReady 函式的程式碼:

Ext.QuickTips.init();

現在,當使用者將滑鼠指標置於此欄位,就會顯示一個球形文字說明顯示錯誤訊息。

我要設定幾個驗證規則的欄位,如指定允許的最小和最大長度、 延遲等到表單提交、 欄位驗證和建立驗證函式的 Url、 電子郵件地址,與其他類型的資料。 您可以看到這項驗證程式碼下載中的詳細資料。

建置 Web 應用程式

現在,讓我們來開發 Web 方案使用 Ext JS 和 ASP。NET MVC。 我使用 ASP。NET MVC 2,但本解決方案應該是不適用於 ASP。NET MVC 3 也。 我將地址的案例在人力資源管理系統中加入員工。

新增員工使用案例描述如下所示:畫面會提示使用者輸入有效的資訊,例如員工識別項、 完整名稱、 地址、 年齡、 薪資和部門的新員工。 [部門] 欄位是一份可供選擇的部門。

主要的實作策略是在用戶端上建立 「 ext 」 JS 表單 — 如您所見,然後再處理使用 ASP 的資料。NET MVC。 保存層將使用 LINQ,來代表商業項目,並將資料保存至資料庫系統。 Microsoft SQL Server 2008 為後端資料庫。

請先開啟 Visual Studio 2010 並使用 ASP 建立新的專案。NET MVC 2 Web 應用程式範本。

接下來,建立資料庫結構描述。 例如,結構描述將會包含兩個實體: 員工和部門。 圖 3 示範如何建立人力資源資料庫以及基礎資料表與條件約束。

圖 3 人力資源資料庫的建立

create table department(
  deptno varchar(20) primary key,
  deptname varchar(50) not null,
  location varchar(50)
);
create unique index undx_department_deptname on department(deptname);
insert into department
  values('HQ-200','Headquarter-NY','New York');
insert into department
  values('HR-200','Human Resources-NY','New York');
insert into department
  values('OP-200','Operations-NY','New York');
insert into department
  values('SL-200','Sales-NY','New York');
insert into department
  values('HR-300','Human Resources-MD','Maryland');
insert into department
  values('OP-300','Operations-MD','Maryland');
insert into department
  values('SL-300','Sales-MD','Maryland');
create table employee(
  empno varchar(20) primary key,
  fullname varchar(50) not null,
  address varchar(120),
  age int,
  salary numeric(8,2) not null,
  deptno varchar(20) not null,
  constraint fk_employee_department_belong_rltn foreign key(deptno)
    references department(deptno)
);
create unique index undx_employee_fullname on employee(fullname);

現在讓我們使用 LINQ to SQL 定義的實體和保存性機制的結構。 請先建立 EmployeeRepository 類別來管理員工資料表的資料存取邏輯。 在這種情況下,您只需要實作建立作業:

public class EmployeeRepository {
  private HumanResourcesDataContext _ctxHumanResources = 
    new HumanResourcesDataContext();
  public void Create(employee employee) {
    this._ctxHumanResources.employees.InsertOnSubmit(employee);
    this._ctxHumanResources.SubmitChanges();
  }
}

您也需要 DepartmentRepository 類別以管理部門資料表的資料存取邏輯。 同樣地,在此簡單的情況下您只需要實作讀取的作業中,以找出的部門清單:

public class DepartmentRepository {
  private HumanResourcesDataContext _ctxHumanResources = 
    new HumanResourcesDataContext();
  public IQueryable<department> FindAll() {
    return from dept in this._ctxHumanResources.departments
           orderby dept.deptname
           select dept;
  }
}

現在讓我們先定義另一個重要的部分架構: 控制站。. 若要定義一個控制器,在 [方案總管] 視窗中的 [控制站] 資料夾上按一下滑鼠右鍵,然後選取 [新增 |控制站。 我可以使用 HumanResourcesController 做為控制站名稱。

「 Ext 」 JS 展示層

現在讓我們回到 「 ext 」 JS,若要建置的應用程式的展示層使用架構。 對於此解決方案,您只需要匯入 「 ext 」 all.js 和 \adapter 和 \resources 資料夾。

移至 Site.Master 頁面以及將參考加入至在標頭項目,以及 < asp: ContentPlaceHolder > Ext JS 檔案標記項目為自訂的 JavaScript 和 CSS 程式碼,為每個頁面的容器中所示 圖 4

圖 4 Site.Master

    <head runat="server">
      <title><asp:ContentPlaceHolder ID="TitleContent" 
        runat="server" /></title>
      <link href="../../Content/Site.css" rel="stylesheet" 
        type="text/css" />
      <!-- Include the Ext JS framework -->
      <link href="<%= Url.Content("~/Scripts/ext-3.2.1/resources/css/ext-all.css") %>" 
        rel="stylesheet" type="text/css" />
      <script type="text/javascript" 
        src="<%= Url.Content("~/Scripts/ext-3.2.1/adapter/ext/ext-base.js") %>">
      </script>
      <script type="text/javascript" 
        src="<%= Url.Content("~/Scripts/ext-3.2.1/ext-all.js") %>">
      </script>    
      <!-- Placeholder for custom JS and CSS and JS files 
        for each page -->
      <asp:ContentPlaceHolder ID="Scripts" runat="server" />
    </head>

現在讓我們將新增 MVC 架構的其他重要的部分: 檢視。. 檢視會顯示表單,以取得一個員工與相關的資料。 移至 HumanResourcesController 索引動作方法上按一下滑鼠右鍵,選取新增檢視畫面。 按一下 [新增檢視畫面] 對話方塊中的 [新增] 按鈕。

若要實作本文稍早建立的 「 ext 」 JS 表單,您需要將 JavaScript 檔案加入至指令碼目錄,並在檢視此 JavaScript 檔案的參考。 然後包含 employee_form.js 檔案的參考,並將 div 項目新增至 [Index.aspx] 檢視 (請參閱 圖 5)。

圖 5新增員工] 表單

    <%@ Page Title="" Language="C#" 
      MasterPageFile="~/Views/Shared/Site.Master" 
      Inherits="System.Web.Mvc.ViewPage" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" 
      runat="server">
    Index
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" 
      runat="server">
      <h2>Add a New Employee</h2>
      <div id="employeeform"></div>
    </asp:Content>
    <asp:Content ID="Content3" ContentPlaceHolderID="Scripts" 
      runat="server">
      <script type="text/javascript" 
        src="<%= Url.Content("~/Scripts/employee_form.js") %>">
      </script>
    </asp:Content>

移至 employee_form.js 檔案,然後加入一些程式碼以設定 ExtJS 表單和其基礎 widget。 第一個步驟是定義要取得的部門清單的 Ext.data.JsonStore 類別的執行個體:

var departmentStore = new Ext.data.JsonStore({
  url: 'humanresources/departments',
  root: 'departments',
  fields: ['deptno', 'deptname']
});

「 Url 」 屬性會指向 HumanResourceController 控制站上的 [部門] 動作方法。 這個方法被透過 HTTP POST 動詞命令。 Root 屬性是的部門清單的根項目。 [欄位] 屬性指定資料欄位。 現在定義表單。 屬性是表示其含義:

var form = new Ext.FormPanel({
  title: 'Add Employee Form',
  renderTo: 'employeeform',
  width: 400,
  url: 'humanresources/addemployee',
  defaults: { xtype: 'textfield' },
  bodyStyle: 'padding: 10px',

在這種情況下,「 url 」 屬性會指向 HumanResourceController 控制站上的 AddEmployee 動作方法。 這個方法也會使用 HTTP POST 存取。

項目] 屬性提供 widget 代表的表單欄位的清單 (圖 6)。 這裡預設 widget 是文字欄位 (這預設值] 屬性中指定)。 第一個欄位是員工數字,而且是必要項 (由 allowBlank 屬性所指定)。 第二個欄位是完整名稱,這也是必要的文字欄位。 [位址] 欄位是選擇性的文字區域。 年齡欄位是選擇性的數字欄位。 [薪資] 欄位是必要的數字欄位。 而最後,部門數字欄位則是識別字串,其中已選取 [從清單中的部門。

圖 6表單欄位 Widget

items: [
  { fieldLabel: 'Employee ID', name: 'empno', allowBlank: false },
  { fieldLabel: 'Fullname', name: 'fullname', allowBlank: false },
  { xtype: 'textarea', fieldLabel: 'Address', name: 'address', 
    multiline: true },
  { xtype: 'numberfield', fieldLabel: 'Age', name: 'age' },
  { xtype: 'numberfield', fieldLabel: 'Salary', name: 'salary', 
    allowBlank: false },
  { xtype: 'combo', fieldLabel: 'Department', name: 'deptno', 
    store: departmentStore, hiddenName: 'deptno', 
    displayField: 'deptname', valueField: 'deptno', typeAhead: true,
    mode: 'remote', forceSelection: true, triggerAction: 'all', 
    emptyText: 'Please, select a department...', editable: false }
],

最後,[按鈕] 屬性被定義來處理表單的動作。 這就像是設定 圖 2,但是 text 屬性具有值時 [新增]。

現在 employee_form.js 檔案已完成。 (我已糊大部分的的檔案中的項目。 請參閱下載適用於列出此檔案的完整原始程式碼的程式碼)。

現在讓我們請到 HumanResourceController,實作對應的動作方法,如所示 圖 7

圖 7 HumanResourceController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using HumanResources_ExtJS_ASPNETMVC.Models;
namespace HumanResources_ExtJSASPNETMVC.Models.BusinessObjects {
  public class HumanResourcesController : Controller {
    DepartmentRepository _repoDepartment = new DepartmentRepository();
    EmployeeRepository _repoEmployee = new EmployeeRepository();
    // GET: /HumanResources/
    public ActionResult Index() {
      return View();
    }
    // POST: /HumanResource/Departments
    [HttpPost]
    public ActionResult Departments() {
      var arrDepartment = this._repoDepartment.FindAll();
      var results = (new {
        departments = arrDepartment
      });
      return Json(results);
    }
    // POST: /HumanResource/AddEmployee
    [HttpPost]
    public ActionResult AddEmployee(employee employee) {
      string strResponse = String.Empty;
      try {
        this._repoEmployee.Create(employee);
        strResponse = "{success: true}";
      }
      catch {
        strResponse = "{success: false, error: \"An error occurred\"}";
      }
      return Content(strResponse);
    }
  }
}

就大功告成啦 !

現在執行方案。您會看到所顯示的 Web 網頁 圖 8。在表單中輸入一些資料,然後按一下 [新增]。您會看到確認訊息方塊。您也會看到在資料庫的 dbo.employee 表格中插入的資料列。

圖 8 執行應用程式

這是真的所有還有要建立簡單 RIA。取決於您想要運用的功能,類似應用程式無法建立與任何其他受歡迎的 JavaScript 架構時仍採用 ASP。NET MVC。很容易,可以替代 Entity Framework 資料] 圖層,使用 Windows Azure 存放裝置] 或 [SQL Azure 轉換為後端資料存放區。這些簡單的建置組塊請建置基本資料中心 RIA 快速又簡單。

Juan Carlos Olamendy 是高階架構設計人員、 開發人員和顧問。.他已辨認為 Microsoft 最有價值專家 (MVP) 和 Oracle ACE 數次。他是在 Windows 通訊基礎 Microsoft 認證技術專家。 您可以連絡在 Olamendy johnx_olam@fastmail.

多虧了要對下列技術專家,來檢閱這份文件:Scott HanselmanEilon Lipton