当我使用 Ext.Net 时,始终不能摆脱最初开发 asp.net 应用程序的方式,也就是,前后台的交互。当你用 asp.net 的思维方式,开发 Ext.Net 时,你会发现应用程序问题很多,我所见过的,比如,页面闪的厉害(刷新次数太多,虽然也是局部刷新);页面脚本错误;页面 CSS 错误等等。这充分说明,错误地使用了 Ext.Net。没有理解 Ajax。知道与会用往往是两回事。
现在,我既不想使用 asp.net 近乎全部刷新页面的方式(虽然可以完全做到局部刷新,但还是不够方便,尤其是对开发),也不想使用类似 jQuery+HTML 的局部刷新,因为这要写太多脚本。
Ext.Net 这个 Ajax 框架,提供了一个很好的方式。让你在脚本代码与后台代码做出权衡。因为,Ext.Net 是用 .Net 封装的 Ext JS,你可以使用 Ext.Net,也可以随意写 Ext JS 代码。
比如,用 Ext.Net 向页面拖放控件,而不是写一堆 Ext JS 脚本来创建,并在必要时,编写 Ext JS 脚本操作页面元素。所有操作都是前台进行,最后才发送给服务器端。
假设页面有个 Ext.Net.GridPanel 和 Ext.Net.Store。但在页面初始化(第一次初始化)时,不加载任何数据,store 也没有 OnRefreshData 事件。
<ext:GridPanel ID="GridPanel1" runat="server" AutoHeight="true" Width="500" Title="植物">
<Store>
<ext:Store ID="Store1" runat="server">
<Reader>
<ext:ArrayReader IDProperty="IntColumn">
<Fields>
<ext:RecordField Name="IntColumn" Type="Int" />
<ext:RecordField Name="DoubleColumn" Type="Float" />
<ext:RecordField Name="StringColumn" Type="String" />
<ext:RecordField Name="DateTimeColumn" Type="Date" DateFormat="Y-m-d" />
<ext:RecordField Name="BoolColumn" Type="Boolean" />
</Fields>
</ext:ArrayReader>
</Reader>
<SortInfo Field="IntColumn" Direction="ASC" />
</ext:Store>
</Store>
<ColumnModel ID="ColumnModel1" runat="server">
<Columns>
<ext:Column Header="IntColumn" DataIndex="IntColumn" />
<ext:Column Header="DoubleColumn" DataIndex="DoubleColumn" />
<ext:Column Header="StringColumn" DataIndex="StringColumn" />
<ext:DateColumn Header="DateTimeColumn" DataIndex="DateTimeColumn" Format="Y-m-d" />
<ext:Column Header="BoolColumn" DataIndex="BoolColumn" />
</Columns>
</ColumnModel>
<SelectionModel>
<ext:RowSelectionModel ID="RowSelectionModel1" runat="server" SingleSelect="false">
</ext:RowSelectionModel>
</SelectionModel>
<View>
<ext:GroupingView ID="GroupingView1" runat="server" ForceFit="true" />
</View>
</ext:GridPanel>
<div style="float: left">
<div>
<ext:Button ID="Button1" runat="server" Icon="Accept" Text="演示 store.add">
<Listeners>
<Click Handler="yourAdd(Store1);" />
</Listeners>
</ext:Button>
</div>
<br />
<div>
<ext:Button ID="Button2" runat="server" Icon="Accept" Text="演示 store.insert">
<Listeners>
<Click Handler="yourInsert(Store1);" />
</Listeners>
</ext:Button>
</div>
<br />
<div>
<div>
<ext:Button ID="Button3" runat="server" Icon="Accept" Text="演示 store.remove">
<Listeners>
<Click Handler="yourRemove(Store1, GridPanel1);" />
</Listeners>
</ext:Button>
</div>
</div>
<br />
<div>
<div style="float: left">
<ext:TextField ID="TextField1" runat="server" FieldLabel="'IntColumn' 字段" Text="7">
</ext:TextField>
</div>
<div>
<ext:Button ID="Button4" runat="server" Icon="Accept" Text="演示 store.removeAt">
<Listeners>
<Click Handler="yourRemoveAt(Store1, TextField1.getValue());" />
</Listeners>
</ext:Button>
</div>
</div>
<br />
<div>
<ext:Button ID="Button5" runat="server" Icon="Accept" Text="演示 store.removeAll">
<Listeners>
<Click Handler="yourRemoveAll(Store1);" />
</Listeners>
</ext:Button>
</div>
<br />
<div>
<ext:Button ID="Button6" runat="server" Icon="Accept" Text="演示 store.loadData">
<Listeners>
<Click Handler="yourLoadData(Store1);" />
</Listeners>
</ext:Button>
</div>
</div>
add( Ext.data.Model[] records ) : Array
addSorted( Ext.data.Model[] records ) : Array
insert( Number index, Ext.data.Model[] records ) : void
remove( Ext.data.Model/Array records, Object isMove ) : void
removeAll( Boolean silent ) : void
removeAt( Number index ) : void
下面演示用 Ext JS 增删改 store。
<script type="text/javascript">
var key = 0;
var data = [
[1, 33.33, "string_0", "2012-01-01", true],
[3, 33.33, "string_1", "2012-01-01", false],
[5, 33.33, "string_2", "2012-01-01", true],
[7, 33.33, "string_3", "2012-01-01", false]
];
Ext.onReady(function() {
Store1.proxy = new Ext.data.MemoryProxy(data),
Store1.loadData(data, true);
});
//var ds_model = Ext.data.Record.create([
// 'IntColumn',
// 'DoubleColumn',
// 'StringColumn',
// 'DateTimeColumn',
// 'BoolColumn'
//]);
var ds_model = Ext.data.Record.create([
{ name: 'IntColumn', type: 'Int' },
{ name: 'DoubleColumn', type: 'float' },
{ name: 'StringColumn', type: 'String' },
{ name: 'DateTimeColumn', type: 'Date' },
{ name: 'BoolColumn', type: 'Boolean' }
]);
var yourAdd = function(store) {
key++;
key++;
var newData = new ds_model(
{
IntColumn: key,
DoubleColumn: (key * 100) / 3,
StringColumn: "string_" + 99,
DateTimeColumn: '1999-01-01',
BoolColumn: false
})
newData.commit();
store.add(newData);
};
var yourAddSorted = function(store) {
key++;
key++;
var newData = new ds_model(
{
IntColumn: key,
DoubleColumn: (key * 100) / 3,
StringColumn: "string_" + 99,
DateTimeColumn: '1999-01-01',
BoolColumn: false
})
newData.commit();
store.addSorted(newData);
};
var yourInsert = function(store) {
key++;
key++;
var newData = new ds_model(
{
IntColumn: key++,
DoubleColumn: (key * 100) / 3,
StringColumn: "string_" + key,
DateTimeColumn: '1999-01-01',
BoolColumn: false
})
newData.commit();
store.insert(0, newData);
};
var yourRemove = function(store, grid) {
var record = grid.getSelectionModel().getSelected();
if (record != undefined) {
store.remove(record);
grid.getSelectionModel().clearSelections();
}
else {
alert('未选择.');
}
};
var yourRemoveAt = function(store, removeAtValue) {
store.removeAt(removeAtValue);
};
var yourRemoveAll = function(store) {
store.removeAll();
};
var yourLoadData = function(store) {
store.loadData(data);
};
</script>
可以做个类比,Store 相当于 .net framework DataTable,而 Record 相当于 DataRow。
Ext.Net.Store(Ext.Net)/ Ext.data.Store(Ext JS)相当于 Syste.Data.DataTable
Ext.Net.RecordField(Ext.Net)/ Ext.data.Recrod(Ext JS)相当于 System.Data.DataRow
官网 add 方法的原型是:add( Object data ) : Array。与insert 方法不一样。按理说应该一样的。个人觉得官网笔误,试了半天报错。按 insert 的参数就没问题了。
其实,在我看来,用 Ext JS 直接操作 Ext.Net.Store 意义不大,除非你想把 store 单纯地作为一个数据缓存容器,不在页面呈现。因为,往往操作 grid 同时,就是在操作 store,而且通过 grid 操作 store,会在页面上看到数据式样的变化(当你编辑 grid 某列的数据后,其右上角有个红色三角)。
但是,了解直接操作 store,会加深通过 grid 操作 store 的理解。
另外,当操作 Record(Ext.data.Record) 时,Record 有几个方法:
也就是说,当创建一个 Record 后,我们可以进行修改、提交修改、撤销修改等操作。这在通过 grid 操作 store 时很常见,而且 Ext.Net 还提供了更强大的功能。比如,操作(增删改) store 完后,将 store 发送给服务器端(处理程序 handle),通过解析 store 中的数据,可以分离用户增加的数据、删除的数据和修改的数据,执行相应的 SQL。
本例的 store 是 ArrayReader,也可以使用 JsonReader。
<ext:Store ID="Store1" runat="server">
<Reader>
<ext:JsonReader IDProperty="IntColumn">
<Fields>
<ext:RecordField Name="IntColumn" Type="Int" />
<ext:RecordField Name="DoubleColumn" Type="Float" />
<ext:RecordField Name="StringColumn" Type="String" />
<ext:RecordField Name="DateTimeColumn" Type="Date" DateFormat="Y-m-d" />
<ext:RecordField Name="BoolColumn" Type="Boolean" />
</Fields>
</ext:JsonReader>
</Reader>
</ext:Store>
但是数据需要改成类数组,而不是前面数组的数组。
var data = [
{ IntColumn: 1, DoubleColumn: 33.33, StringColumn: "string_0", DateTimeColumn: "2012-01-01", BoolColumn: true },
{ IntColumn: 3, DoubleColumn: 33.33, StringColumn: "string_1", DateTimeColumn: "2012-01-01", BoolColumn: false },
{ IntColumn: 5, DoubleColumn: 33.33, StringColumn: "string_2", DateTimeColumn: "2012-01-01", BoolColumn: true },
{ IntColumn: 6, DoubleColumn: 33.33, StringColumn: "string_3", DateTimeColumn: "2012-01-01", BoolColumn: false },
{ IntColumn: 7, DoubleColumn: 33.33, StringColumn: "string_4", DateTimeColumn: "2012-01-01", BoolColumn: true }
];
Ext.Net/Ext JS_用 Ext JS 遍历查找过滤检索 Ext.Net.Store 检索
下载 Demo