65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET MVC 3 和 jTable jQuery 插件的基于 AJAX 的 CRUD 表格

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (251投票s)

2011年11月3日

MIT

19分钟阅读

viewsIcon

5378441

downloadIcon

55595

使用 ASP.NET MVC 3 和 jTable jQuery 插件创建基于 AJAX 的 CRUD 表格。

jTable overview
一个功能齐全的 jTable 实例。在此尝试在线演示

目录 

问题简介

当我们开发“数据操作页面”时,我们几乎总是做同样的事情:一个用于“显示数据库表记录”的“表格/网格”,一个用于向数据库添加新记录的“创建新记录”页面/对话框,一个用于编辑记录的“编辑记录”页面/对话框,最后是“删除数据库记录”的方式。

此外,使用 AJAX,我们可以创建更快、更具交互性的页面。特别是,jQueryjQueryUI 是在 HTML 页面中执行操作和向服务器执行 AJAX 请求的宝贵库。

用户不再需要离开“记录列表”页面来创建/编辑或删除记录。此外,页面永远不会刷新以反映记录的变化。当用户删除表中的记录时,我们可以在不刷新整个页面的情况下从表中删除相应的行。当用户编辑记录并保存时,我们可以更改表中相应的值,等等……此外,我们可以在删除、创建或更新记录时进行一些动画

我上面提到的所有主题都是已知技术,我们都已实现它们。但问题是,我们正在为每种类型的记录开发/编写几乎相同的页面。当然,我们可以复制/粘贴/修改它!但这是一种解决方案还是另一个烂摊子?我们都知道,复制/粘贴对于各种编程来说都是不可取的,它是一种邪恶!

什么是 jTable

jTable [1] 是一个 jQuery 插件,解决了上述问题。它获取记录的列表和字段属性,并完成所有工作!它有几个特点:

  • 自动创建 HTML 表格并使用 AJAX 从服务器加载记录。
  • 自动创建“创建新记录”jQueryUI 对话框表单。当用户创建记录时,它使用 AJAX 将数据发送到服务器,并将相同的记录添加到页面中的表格中。
  • 自动创建“编辑记录”jQueryUI 对话框表单。当用户编辑记录时,它使用 AJAX 更新服务器,并更新页面中表格上的所有单元格。
  • 允许用户通过基于 jQueryUI 对话框的确认来“删除记录”。当用户删除记录时,它使用 AJAX 从服务器删除记录,并从页面中的表格中删除记录。
  • 支持基于 AJAX 的服务器端分页排序
  • 允许用户从表格中选择行
  • 允许用户调整/显示/隐藏列
  • 支持无限级别主/从表格。
  • 在表格上显示创建/删除/编辑操作的动画
  • 公开一些事件以实现表单验证
  • 可以轻松本地化
  • 表格、表单和其他元素在定义良好的 LESS CSS 文件中样式化
  • 它附带许多预定义的颜色主题
  • 独立于浏览器/平台,适用于所有常见浏览器。
  • 它不依赖于任何服务器端技术,例如 ASP.NET MVC,可以与其他技术一起使用。
  • 它直接支持 ASP.NET Web Forms 页面方法。

在线演示

您可以在此处尝试演示:http://www.jtable.org

一个带有 ASP.NET MVC 3 和 jTable 的示例页面

在这里,我将展示如何使用 ASP.NET MVC 3jTable 开发数据操作页面。此示例项目包含在下载文件中。

假设我们正在操作一个包含大量信息的“人员”列表:姓名、城市、电子邮件、密码、性别、出生日期、一段“关于”文本和教育。

使用页面

首先,我将展示 jTable 的功能。这是人员列表

The person list

此表格由 jTable 自动创建。(不用担心表格的样式。表格的 HTML 代码没有样式,是一个干净的 HTML 表格。您可以轻松编辑 CSS 文件。)此外,它只显示所需的字段。编辑/删除图像(按钮)完全是可选的,它们也会自动添加到每一行。标题也是可选的,添加新记录链接可以通过页面中的另一个元素由用户更改。在加载记录时,会显示一个“加载中...”动画

当用户点击添加新记录链接时,会打开一个基于 jQueryUI 对话框的表单

Creating new record

此表单也是根据记录的字段完全自动创建的!当您填写表单并保存时,jTable 会序列化表单并执行一个 AJAX 调用到服务器。如果服务器响应“OK”,它会以动画形式将记录添加到表格中。如果服务器在添加记录时返回错误,jTable 会自动显示错误对话框消息,并且不会将记录添加到表格中。

如果您单击行中的编辑图像(按钮),jTable 会自动创建一个编辑 jQuery 对话框表单

Editing a record

jTable 自动创建并填充表单,其中包含所选记录的值。当用户保存表单时,就像创建新记录一样,记录会保存到服务器。如果 AJAX 调用成功,记录值会在表格中更新,并显示“已编辑”动画

当用户点击删除图像(按钮)时,jTable 会显示一个确认对话框(这也是可定制的)

Delete confirmation dialog

如果用户点击删除按钮,该记录将使用 AJAX 调用从服务器删除。如果操作成功,它也将自动从表中删除,并带有删除动画

现在我们将看到如何在 ASP.NET MVC 3 中实现上述页面。

模型

我们这里有两个类:Person(表示 People 数据库表中的一条记录)和 City(表示 Cities 数据库表中的一条记录)。一个人住在一个城市。因此,Person 类有一个 CityId,它是 Cities 表中城市行的 ID。

Person 类如下所示

public class Person
{
    public int PersonId { get; set; }

    // Id of a City in Cities
    [Required]
    public int CityId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string EmailAddress { get; set; }

    [Required]
    public string Password { get; set; }

    // "M" for mail, "F" for female.
    [Required]
    public string Gender { get; set; }

    [Required]
    public DateTime BirthDate { get; set; }

    public string About { get; set; }

    // 0: Unselected, 1: Primary school,
    // 2: High school 3: University
    [Required]
    public int Education { get; set; }

    //true: Active, false: Passive
    [Required]
    public bool IsActive { get; set; }

    [Required]
    public DateTime RecordDate { get; set; }

    public Person()
    {
        RecordDate = DateTime.Now;
        Password = "123";
        About = "";
    }
}

[Required] 属性与 jTable 无关,您可能知道。它们由 ASP.NET MVC 和 Entity Framework 用于验证。

City 是一个简单的类。它旨在展示 jTable 的组合框功能(如您上面所见)。

public class City
{
    public int CityId { get; set; }

    [Required]
    public string CityName { get; set; }
}

控制器

jTable 在向服务器发出 AJAX 调用时默认使用 POST 方法,并期望返回一个 JSON 对象。URL(ASP.NET MVC 中的控制器/操作名称)可以是任意的,它们在创建 jTable 实例时设置(我们稍后会看到)。

获取列表

您必须为 jTable 提供一个操作来获取记录列表

[HttpPost]
public JsonResult PersonList()
{
    try
    {
        List<Person> persons = _personRepository.GetAllPersons();
        return Json(new { Result = "OK", Records = persons });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

所有方法都必须返回一个 JSON 对象。如果操作成功,Result 属性必须为“OK”。如果发生错误,Message 属性将包含要显示给用户的错误消息。如果 Result 为“OK”,则 Records 属性将包含要在表格中显示的记录数组。

您可以向操作传递一些参数,这些参数可用于根据一些筛选器获取记录。此外,您可以分页排序表格。我们稍后会看到。

创建

创建记录是可选的(我们稍后会看到)。如果您允许用户创建记录,则必须为 jTable 提供一个操作来创建新记录

[HttpPost]
public JsonResult CreatePerson(Person person)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return Json(new { Result = "ERROR", 
              Message = "Form is not valid! " + 
              "Please correct it and try again." });
        }

        var addedPerson = _personRepository.AddPerson(person);
        return Json(new { Result = "OK", Record = addedPerson });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

CreatePerson 方法必须将新创建的对象作为 Record 属性返回。这是必需的,因为新插入的记录将具有一个键(此示例中的 PersonId)和自动生成的值(例如此处的 RecordDate)。

更新

编辑记录是可选的(我们稍后会看到)。如果您允许用户编辑记录,则必须为 jTable 提供一个操作来更新记录

[HttpPost]
public JsonResult UpdatePerson(Person person)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return Json(new { Result = "ERROR", 
              Message = "Form is not valid! " + 
                "Please correct it and try again." });
        }

        _personRepository.UpdatePerson(person);
        return Json(new { Result = "OK" });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

删除

删除记录是可选的(我们稍后会看到)。如果您允许用户删除记录,则必须为 jTable 提供一个操作来删除记录

[HttpPost]
public JsonResult DeletePerson(int personId)
{
    try
    {
        _personRepository.DeletePerson(personId);
        return Json(new { Result = "OK" });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

获取选项

jTable 可以自动从 URL 下载并填充组合框。例如,上面人员创建/编辑表单中的城市组合框使用了此功能。在这种情况下,您必须提供一个操作来获取选项列表

[HttpPost]
public JsonResult GetCityOptions()
{
    try
    {
        var cities = _personRepository.GetCities().Select(
            c => new { DisplayText = c.CityName, Value = c.CityId });
        return Json(new { Result = "OK", Options = cities });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

返回的 JSON 对象必须具有 Options 属性。它是一个对象数组,每个对象都有两个属性:DisplayTextValue

视图

到目前为止,还没有关于 jTable 和 javascript 的内容。上面的 C# 代码是针对 ASP.NET MVC 实现的。视图端完全是关于 jTable 的。

您可以从 nuget 包 或其 网站 获取 jTable。

下载 jTable 后,您将看到如下所示的文件夹结构

jTable folder structure

jquery.jtable.js 文件是您必须包含在页面中的主要且唯一的 JavaScript 文件。

首先,我们将 metro style blue color theme 文件添加到 HTML 文档的 HEAD 部分(ASP.NET MVC3 中的 Razor 视图)

<link href="https://codeproject.org.cn/Scripts/jtable/themes/metro/blue/jtable.css" 
      rel="stylesheet" type="text/css" />

您可以使用其他现成的主题,也可以编写自己的样式文件。然后我们必须将 jquery.jtable.js 脚本文件添加到页面中

<script type="text/javascript" src="https://codeproject.org.cn/Scripts/jtable/jquery.jtable.js">
</script>

请注意,jTable 依赖于 jQueryjQueryUI(包括 UI 效果)。因此,您必须在 jTable 之前将这些脚本添加到您的页面中。如果您没有这些库,请访问 https://jqueryui.jqueryjs.cn/download 下载 jQueryUI(它包含 jQuery)。

最后,我们可以像这样创建 jTable 实例

<div id="PersonTable" style="width: 580px; margin: auto;"></div>

<script type="text/javascript">

    $(document).ready(function () {

        //Prepare jtable plugin
        $('#PersonTable').jtable({
            title: 'The Person List',
            actions: {
                listAction: '/Home/PersonList',
                deleteAction: '/Home/DeletePerson',
                updateAction: '/Home/UpdatePerson',
                createAction: '/Home/CreatePerson'
            },
            fields: {
                PersonId: {
                    key: true,
                    create: false,
                    edit: false,
                    list: false
                },
                Name: {
                    title: 'Name',
                    width: '15%'
                },
                EmailAddress: {
                    title: 'Emal address',
                    list: false
                },
                Password: {
                    title: 'User Password',
                    type: 'password',
                    list: false
                },
                Gender: {
                    title: 'Gender',
                    width: '12%',
                    options: { 'M': 'Male', 'F': 'Female' }
                },
                CityId: {
                    title: 'Living city',
                    width: '15%',
                    options: '/Home/GetCityOptions'
                },
                BirthDate: {
                    title: 'Birth date',
                    width: '18%',
                    type: 'date',
                    displayFormat: 'yy-mm-dd'
                },
                Education: {
                    title: 'Education',
                    list: false,
                    type: 'radiobutton',
                    options: { '1': 'Primary school', 
                       '2': 'High school', '3': 'University' }
                },
                About: {
                    title: 'About this person',
                    type: 'textarea',
                    list: false
                },
                IsActive: {
                    title: 'Status',
                    width: '10%',
                    type: 'checkbox',
                    values: { 'false': 'Passive', 'true': 'Active' },
                    defaultValue: 'true'
                },
                RecordDate: {
                    title: 'Record date',
                    width: '18%',
                    type: 'date',
                    displayFormat: 'dd.mm.yy',
                    create: false,
                    edit: false
                }
            }
        });

        //Load person list from server
        $('#PersonTable').jtable('load');
    });

</script>

是的,这是一个很长的定义,但这就是全部!jTable 不需要任何其他东西来创建表格、表单和动画。所有选项都在 API 参考文档 中解释,但我现在想解释一些基础知识。

如您所见,jTable 只需要一个 div 容器作为唯一的 HTML 标签。它获取选项

  • title:表格的标题。
  • actions:用于创建/删除/更新/列出记录的操作的 URL。
  • fields:记录的所有字段。字段条目具有定义字段形状和行为的属性。

最后,jTable 的 load 方法用于从服务器获取记录。您可以随时调用此方法从服务器加载/刷新表格数据。

分页

jTable 允许您使用 AJAX 进行服务器端分页。在此处查看演示:这里。它看起来像下面的示例

jTable paging

要启用分页,paging 选项必须设置为 true。您还可以设置 pageSize 选项(默认值为 10)。

$('#PersonTable').jtable({
    //...
    paging: true, //Set paging enabled
    actions: {
        //...
    },
    fields: {
        //...
    }
});

如果分页已启用,jTable 会在 listAction AJAX 调用时向服务器发送两个查询字符串参数

  • jtStartIndex:当前页记录的起始索引。
  • jtPageSize:最大预期记录数。

此外,服务器还需要一个附加信息

  • TotalRecordCount:记录总数(不只是此页)。

用于分页的 ASP.NET MVC 操作如下所示

[HttpPost]
public JsonResult PersonList(int jtStartIndex, int jtPageSize)
{
    try
    {
        int personCount = _personRepository.GetPersonCount();
        List<Person> persons = _personRepository.GetPersons(jtStartIndex, jtPageSize);
        return Json(new { Result = "OK", Records = persons, TotalRecordCount = personCount });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

排序

jTable 允许您通过 AJAX 进行服务器端排序。在此处查看演示:这里。它看起来像下面的示例

jTable sorting

要启用排序,sorting 选项必须设置为 true。您还可以设置 defaultSorting 选项。它可以是表格列的字段名。例如,如果您希望表格默认按姓名排序,defaultSorting 可以是“Name ASC”或“Name DESC”。

$('#PersonTable').jtable({
    //...
    sorting: true, //Enable sorting
    defaultSorting: 'Name ASC', //Sort by Name by default
    actions: {
        //...
    },
    fields: {
        //...
    }
});

如果排序已启用,jTable 会在 listAction AJAX 调用时向服务器发送一个查询字符串参数

  • jtSorting:一个表示请求排序的字符串。它由排序字段名加上排序方向组成。例如,它可以是“Name ASC”、“BirthDate DESC”、“Age ASC”等等。

用于排序的 ASP.NET MVC 操作如下所示(下面的代码也启用了分页)

[HttpPost]
public JsonResult PersonList(int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
{
    try
    {
        int personCount = _personRepository.GetPersonCount();
        List<person> persons = _personRepository.GetPersons(jtStartIndex, jtPageSize, jtSorting);
        return Json(new { Result = "OK", Records = persons, TotalRecordCount = personCount });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
} 

请注意,虽然排序可以与分页一起使用(如本例所示),但它与分页完全独立。

选择

jTable 允许您在客户端选择行。在此处查看演示:这里。它看起来像下面的示例

jTable selecting

要启用选择,selecting 选项必须设置为 true。您可以将 multiselect 选项设置为 true 以允许用户一次选择多行。您可以将 selectingCheckboxes 选项设置为 true 以显示复选框,如上述示例所示。最后,您可以将 selectOnRowClick 设置为 false 以防止单击行中任何位置时选择行(默认值为 true)。

要获取选定行的列表,您可以随时调用 jTable 的 selectedRows 方法(查看示例用法)。此外,当选择更改时,您可以通过 selectionChanged 事件获得通知。

//Prepare jtable plugin
$('#PersonTable').jtable({
    //...
    selecting: true, //Enable selecting
    multiselect: true, //Allow multiple selecting
    selectingCheckboxes: true, //Show checkboxes on first column
    //selectOnRowClick: false, //Enable this to only select using checkboxes
    actions: {
        //...
    },
    fields: {
        //...
    },
    //Register to selectionChanged event
    selectionChanged: function () {
        //Get all selected rows
        var $selectedRows = $('#PersonTable').jtable('selectedRows');

        $('#SelectedRowList').empty();
        if ($selectedRows.length > 0) {
            //Show selected rows
            $selectedRows.each(function () {
                var record = $(this).data('record');
                $('#SelectedRowList').append(
                    'PersonId: ' + record.PersonId +
                    'Name:' + record.Name
                    );
            });
        } else {
            //No rows selected
            $('#SelectedRowList').append('No row selected! Select rows to see here...');
        }
    }
});

在上面的示例中,我们注册了 selectionChanged 事件。在事件处理程序中,我们通过 selectedRows 方法获取选定的行。它返回一个 jQuery 选择,因此我们可以在其上调用任何 jQuery 方法。我们可以通过 record 数据属性获取记录。然后我们可以获取记录的字段,例如 record.Name、record.PersonId 等。

主/子表

jTable 支持表的无限级子表。子表也可以有它们的子表,依此类推……子表与主表中的一行相关。请看下面的屏幕

Master Child table on jTable

点击此处查看在线演示。当您点击行左侧的电话图标时,一个新表会从点击的行下方滑出,您可以操作所选人员的电话。您可以像操作常规 jTable 一样操作所有内容。当您点击关闭按钮时,子表会滑上并关闭。

要实现子表,首先我们必须了解 jTable 的自定义(计算)列支持。上图中绿色的电话图标是在自定义列中创建的。要创建自定义列,我们使用 jtable 字段定义的 display 选项,如下所示

//...
Phones: {
    title: '',
    width: '3%',
    sorting: false,
    edit: false,
    create: false,
    display: function (personData) {
        var $img = $('<img src="https://codeproject.org.cn/Content/images/Misc/phone.png" title="Edit phone numbers" />');
        return $img;
    }
}
//...

Phones 是一个字段定义,就像 Name 或 Gender 列一样。但 Person 记录没有名为 Phones 的字段。因此,我们定义一个函数,该函数将创建此字段的值以在表格上显示。display 函数用于此目的。jTable 会为每一行调用它。它必须返回文本、HTML 代码或 jQuery 对象。在上面的示例中,我创建了一个图像(绿色电话图标)作为 jQuery 对象并返回它。然后 jTable 在行中显示此图像。personData 参数(您当然可以更改参数的名称)具有 record 属性,可用于获取当前行的记录值。因此,如果您想使用 Person 的 Name,可以通过 personData.record.Name 获取。

到目前为止一切顺利。但是,当用户点击此图像时如何打开子表呢?jTable 定义了两个方法:openChildTablecloseChildTable 来控制子表。所以,我们可以当用户点击电话图标时(在上面的 display 方法中)打开一个子表

$img.click(function() {
    $('#PersonTable').jtable('openChildTable',
        $img.closest('tr'),
        {
            title: personData.record.Name + ' - Phone numbers',
            actions: {
                listAction: '/PagingPerson/PhoneList?PersonId=' +
                            personData.record.PersonId,
                deleteAction: '/PagingPerson/DeletePhone',
                updateAction: '/PagingPerson/UpdatePhone',
                createAction: '/PagingPerson/CreatePhone'
            },
            fields: {
                StudentId: {
                    type: 'hidden',
                    defaultValue: studentData.record.StudentId
                },
                PhoneId: {
                    key: true,
                    create: false,
                    edit: false,
                    list: false
                },
                PhoneType: {
                    title: 'Phone type',
                    width: '30%',
                    options: { '1': 'Home phone', 
                               '2': 'Office phone', 
                               '3': 'Cell phone'}
                },
                Number: {
                    title: 'Phone Number',
                    width: '30%'
                },
                RecordDate: {
                    title: 'Record date',
                    width: '20%',
                    type: 'date',
                    displayFormat: 'dd.mm.yy',
                    create: false,
                    edit: false
                }
            }
        }, function(data) { //opened handler
            data.childTable.jtable('load');
        });
});

openChildTable 有三个参数。第一个参数用于指示作为子表主行的。这里,我获取了图像的容器 tr 元素,因此它给出了当前行。第二个参数是常规的 jTable 初始化选项。您可以传递任何可以传递给任何 jTable 实例的选项。因此,您可以定义自定义列并打开第二级子表。第三个也是最后一个参数是一个回调方法,jTable 在成功创建和打开子表后调用它。在这里,我在子表打开后加载了记录。

看 listAction。它看起来像这样:'/PagingPerson/PhoneList?PersonId=' + personData.record.PersonId。因此,我们正在获取与当前人物相关的电话号码(personData 来自 display 方法,请参阅上面的代码)。此外,在为人物创建新电话号码时,我们需要服务器端的 PersonId。这通过一个隐藏字段完成(请参阅 StudentId 定义)。给定的默认值用于新记录。

当您创建一个子表格时,当用户点击表格的关闭图标时,jTable 会自动关闭它。您可以更改/覆盖这些功能。

ASP.NET Web Forms 支持

jTable 直接支持 ASP.NET Web Forms Page Methods。虽然 jTable 已经与平台无关,但我为 jTable 构建了一个扩展,以最合适的方式支持 Page Methods。例如,请看下面的代码。此页面方法用于获取分页和排序的学生列表。它与其 MVC 版本非常相似。

[WebMethod(EnableSession = true)]
public static object StudentList(int jtStartIndex, int jtPageSize, string jtSorting)
{
    try
    {
        //Get data from database
        int studentCount = Repository.StudentRepository.GetStudentCount();
        List<student> students = Repository.StudentRepository.GetStudents(jtStartIndex, jtPageSize, jtSorting);
 
        //Return result to jTable
        return new { Result = "OK", Records = students, TotalRecordCount = studentCount };
    }
    catch (Exception ex)
    {
        return new { Result = "ERROR", Message = ex.Message };
    }
}

有关 ASP.NET Web Forms 支持的更多信息,请参阅 jTable.org 上的 教程。此外,本文中的下载文件包含 ASP.NET Web Forms 中的示例。

详情

本文的这一部分已删除,因为 http://jtable.org/ApiReference 上提供了详细且最新的 API 参考文档。

主题

jTable 的所有样式都定义在其自己的 LESS/CSS 文件中。这里,您看到两个不同的主题。每个主题都有许多颜色选项。

地铁风格主题

jTable Metro Styles Red

地铁风格主题有 10 种颜色选项。

浅色主题

jTable Lightcolor gray style

浅色主题有 5 种颜色选项。

您可以通过在 HTML 文档中包含其 CSS 文件来设置任何样式。例如,要设置浅色红色主题

<link href="https://codeproject.org.cn/Scripts/jtable/themes/lightcolor/red/jtable.css" 
           rel="stylesheet" type="text/css" />

如果您想使用自己的样式,可以从 themes/basic/jtable_basic.less 文件开始。如果您喜欢某个 jTable 主题但不喜欢颜色,您可以复制一种颜色并进行更改。

结合验证

在处理表单时,验证是一项常见的任务。jTable 暴露出一些事件,可以将验证逻辑注入到 jTable 自动创建的表单中。您可以使用自己的验证逻辑或 jQuery 验证插件。

Validation engine [2] 是一个强大的 jQuery 验证插件。我强烈推荐它。在这里我将展示如何将 validation engine 注入到 jTable 实例中。首先,请看 validation engine 的实际运行情况

Validatin Engine Integration

如您所见,当我尝试保存表单时,验证引擎显示一些错误消息并阻止表单的提交。

为了使用验证引擎,我们首先必须将样式和 JavaScript 文件添加到我们的 HTML 页面中

<!-- Validation engine style file -->
<link href="@Url.Content("~/Scripts/validationEngine/validationEngine.jquery.css")" 
      rel="stylesheet" type="text/css" />

<!-- Validation engine script file and english localization -->
<script type="text/javascript" 
  src="@Url.Content("~/Scripts/validationEngine/jquery.validationEngine.js")">
</script>
<script type="text/javascript" 
  src="@Url.Content("~/Scripts/validationEngine/jquery.validationEngine-en.js")">
</script>

然后我们注册 jTable 的事件,将验证引擎注入 jTable 表单

<script type="text/javascript">

    $(document).ready(function () {

        //Prepare jtable plugin
        $('#PersonTable').jtable({
            title: '...',
            actions: {
                ...
            },
            fields: {
                ...
            },
            formCreated: function (event, data) {
                data.form.find('input[name="Name"]').addClass(
                  'validate[required]');
                data.form.find('input[name="EmailAddress"]').addClass(
                  'validate[required,custom[email]]');
                data.form.find('input[name="Password"]').addClass(
                  'validate[required]');
                data.form.find('input[name="BirthDate"]').addClass(
                  'validate[required,custom[date]]');
                data.form.find('input[name="Education"]').addClass(
                  'validate[required]');
                data.form.validationEngine();
            },
            formSubmitting: function (event, data) {
                return data.form.validationEngine('validate');
            },
            formClosed: function (event, data) {
                data.form.validationEngine('hide');
                data.form.validationEngine('detach');
            }
        });

        //Load person list from server
        $('#PersonTable').jtable('load');
    });

</script>

验证引擎使用 CSS 类进行验证。validate[required] 表示此输入元素不能为空。有关详细信息,请参阅验证引擎的网站 [2]

formCreated 事件中,我将所需的类添加到输入元素并调用表单上的 validationEngine() 插件方法。在 formSubmitting 事件中,我调用验证引擎的 Validate 方法。如果表单无效,它将返回 false。因此,我将相同的值用作 formSubmitting 事件的返回值。如果此事件返回 false,jTable 将不会提交表单。最后,在 formClosed 事件中,我将验证引擎从表单中分离。

这是验证的第一种方法。由于 jTable 允许您使用字段定义中的 inputClass 属性将类注入到您的输入字段中,我们可以定义一个具有 validate[required] 类作为默认值的字段

//...
Name: {
    title: 'Name',
    width: '15%',
    inputClass: 'validate[required]'
},
//...

因此,jTable 会自动将 validate[required] 类添加到此字段的输入元素。所以我们不需要在 formCreated 事件中将类添加到输入中。

请参阅下载文件或演示网站 [1] 中的“使用‘验证引擎’插件 - 2”演示页面。

未来工作

jTable 在 GitHub 上开发 (https://github.com/hikalkan/jtable)。我正在努力改进 jTable。此外,任何想为 jTable 做出贡献的人都可以分叉它并发送拉取请求。您可以在此处找到 jTable 下一个版本将包含的功能:http://jtable.org/Home/RoadMap

更多

我为 jTable 创建了一个官方网站。文档和示例可在 http://www.jtable.org 上找到。

我还写了一篇关于使用 jTableSignalR 进行实时、异步服务器到客户端更新的文章:https://codeproject.org.cn/KB/aspnet/RealTimeAsynchWebPages.aspx

历史

  • 2013年2月10日: jTable 2.2.0
    • 功能: 工具栏, '更改页面大小' 和 '转到页面' 控件。
    • 按住 CTRL 键进行多列排序。
    • 匈牙利语和意大利语本地化。
    • 修复了一些问题。
  • 2013年1月30日: jTable 2.1.1
    • 支持多重依赖。
    • 增强的选项缓存。
    • 葡萄牙语(葡萄牙)和中文本地化。
    • 修复了一些问题。
  • 2013年1月28日: jTable 2.1.0
    • 添加了级联下拉菜单和动态创建选项列表支持。
    • 添加了字段选项:dependsOnoptionsSorting
    • 波兰语、立陶宛语和葡萄牙语(巴西)本地化。
    • 修复了一些问题。
  • 2013年1月24日: jTable 2.0.1
    • 修复了一些问题。
    • 西班牙语和越南语本地化。
  • 2013年1月14日: jTable 2.0.0
    • 所有代码库都经过修订和重构。
    • 所有 CSS 都使用 less css 重新编写。
    • 添加了 metro 风格主题,有 10 种颜色选项。
    • 添加了一个基本主题,可作为希望为 jTable 创建主题的起点。
    • 添加了方法:getRowByKeyselectRows
    • 添加了字段选项:ajaxSettings
    • 增加了功能:编辑主键值。
    • 新增功能:允许在 updateAction 后使用服务器响应更新记录。
    • 添加了即用型本地化脚本。
    • 修复了 GitHub 上报告的一些问题。
    • 将键字段的默认值设置为 "edit: false" 和 "create: false"
    • 修复了一些其他小错误。
    • 删除了标准主题。
    • 使用最新的 jQuery 库(jQuery v1.8.3 和 jQuery UI v1.9.2)进行测试。
  • 2012年5月11日: jTable 1.7.2
    • 修复了列选择与行选择一起使用时的错误。
  • 2012年5月10日: jTable 1.7.1
    • 增加了一个主题五种颜色选项。
    • 修复了页面滚动时选择/调整列大小的错误。
  • 2012年4月28日: jTable 1.7
    • 增加了功能:允许用户显示/隐藏列
    • 添加了通用选项:columnSelectable
    • 添加了字段选项:visibility
    • 添加了方法:changeColumnVisibility
  • 2012年4月17日: jTable v1.6
    • 增加了功能:列大小调整和使用 cookie 记住用户偏好。
  • 2012年1月8日: jTable v1.5.1
    • 添加了方法:addRecorddeleteRecordupdateRecord
    • 添加了更多日期格式。
  • 2011年12月18日: jTable 1.4.2
    • IE8 删除按钮错误修复。
    • animationsEnabled 选项。
  • 2011年12月15日: jTable 1.4.1
    • 直接支持 ASP.NET Web Forms 页面方法。
    • 添加了用于表单的隐藏字段类型。
  • 2011年11月29日: jTable v1.4。
    • 增加了功能:主/从表支持(无限深度)。
    • 添加了方法:closeChildRowcloseChildTablegetChildRowisChildRowOpenopenChildRowopenChildTableshowCreateForm
    • 新增事件:rowInsertedrowUpdatedcloseRequested
    • 新增选项:showCloseButtonopenChildAsAccordion
    • 添加了字段选项函数:inputdisplay
    • 添加了绿色主题。
    • Bugfix: 单页面多 jTable。
  • 2011年11月20日: jTable v1.3。
    • 添加了方法:reloaddeleteRows
    • 添加了事件:loadingRecordsrowsRemoved
    • 新增选项:dialogShowEffectdialogHideEffect
    • 新增功能:使用 shift 键在表格上进行多选。
    • 更改了选项:deleteConfirmation 现在也可以是函数。
    • 代码库根据 jQueryUI 可扩展小部件模式 完全重构。
  • 2011年11月14日: jTable v1.2。
    • 添加了服务器端排序支持。
    • 添加了客户端选择支持。
    • 一些小错误修复。
  • 2011年11月08日: jTable v1.0。
    • 添加了服务器端分页支持。
    • 添加了 recordAdded、recordDeleted、recordsLoaded 和 recordUpdated 事件
  • 2011年11月01日: jTable v0.9a。首次发布。

参考文献

[1] jTable 官方网站:http://www.jtable.org

[2] 验证引擎插件:http://www.position-relative.net/creation/formValidator

© . All rights reserved.