igGrid
のリモート機能は、特定のリモート要求の処理と結果データを返すためにバックエンド実装を要求します。
以下の機能はリモート機能があります。
該当する機能の関連 type オプションで有効にできます。例:
features: [
{ name: "Paging", type: "remote" },
{ name: "Sorting", type: "remote" },
{ name: "Filtering", type: "remote" },
...
]
Ignite UI for MVC Grid を使用する際に、関連する GridDataSourceActionAttribute
操作を追加し、既定でこれらの機能が処理されることによってリモートが初期化されることを要求します。
操作フィルターの属性は、グリッド データを返す MVC 操作を修飾するために使用できます。
例:
[GridDataSourceAction]
public ActionResult GetGridData()
{
...
return View(quryableData);
}
さまざまなリモート グリッド機能によって受信した要求を処理し、グリッドへ処理済みの JSON を戻します。
注: ビューでグリッドを構成する際に
GridDataSourceAction
属性を使用します。GridModel
クラスを使用してコントローラーのグリッドを構成する場合、GridModel.GetData
インスタンス メソッドを使用してデータをブラウザーへ戻す必要があります。
上記メソッドを使用してリモート機能を最大限に活用することをお勧めします。
MVC ラッパーへアクセスができない場合 (ASP.NET プロジェクトで Ignite UI for jQuery を使用している場合など)、あるいはこれらの要求を処理するためにカスタム ロジックを構築する必要がある場合があります。
このトピックは手動で igGrid
機能を処理する手順について説明します。
このセクションは、リモート ページングの構成および処理の手順について説明します。
手順:
以下の表は、リモート ページングに影響があるオプションを示します。
オプション | 説明 | 必須 |
---|---|---|
responseDataKey | これはデータ レコードが保持される応答内のプロパティです。 | はい |
dataSource | $.ig.DataSource が受け入れる任意の有効なデータ ソース、または $.ig.DataSource 自体のインスタンスにすることができます。 |
はい。バックエンドの url を設定してください。 |
recordCountKey | データ ソース中のレコード総数を保持する応答内のプロパティです。 | はい |
type | ページングのタイプを設定します。 | はい。remote に設定してリモート ページングを有効にします。 |
pageSizeUrlKey | 現在要求されているページ サイズを保持するエンコードされた URL パラメータの名前。 | いいえ。設定しない場合、OData 規則がデフォルトで使用されます。 |
pageIndexUrlKey | 現在要求されているページ インデックスを保持するエンコードされた URL パラメータの名前。 | いいえ。設定しない場合、OData 規則がデフォルトで使用されます。 |
構成の例:
responseDataKey: "Records",
dataSource: "http://<server>/grid/GetData",
features: [
{ name: "Paging", type: "remote", recordCountKey: "TotalRecordsCount" }
]
例のページ要求によって生成される要求
http://<server>/grid/GetData?$skip=0&$top=25
要求が送信されるバックエンドは以下を行います。
$skip
および $top
)。{Records: <data>, TotalRecordsCount: totalCountOfAllRecords}
データを含むプロパティは、クライアント側で定義された responseDataKey
オプションと一致する必要があります。また、合計数を保持するプロパティは、ページ機能の recordCountKey
オプションと一致する必要があります。
以下の例は、ASP.NET MVC アプリケーションに上記手順を適用する方法です。
C# の場合:
public JsonResult GetData() {
IEnumerable<Order> orders = RepositoryFactory.GetOrderRepository().Get().Take(200);
IQueryable data = orders.AsQueryable();
int totalCount = data.Count();
if (Request.QueryString["$top"] != null && Request.QueryString["$skip"] != null) {
data = ApplyPaging(Request.QueryString, data);
}
JsonResult result = new JsonResult();
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
result.Data = new { Records = data, TotalRecordsCount = totalCount };
return result;
}
private IQueryable ApplyPaging(NameValueCollection queryString, IQueryable data)
{
int recCount = Convert.ToInt32(queryString["$top"]);
int startIndex = Convert.ToInt32(queryString["$skip"]);
data = data.Skip(startIndex).Take(recCount);
return data;
}
このセクションは、リモート フィルタリングの構成および処理の手順について説明します。
手順:
以下の表は、バックエンドからの応答を手動で処理する場合に設定する必要のある、リモート フィルタリングに影響するオプションの一覧です。
オプション | 説明 | 必須 |
---|---|---|
dataSource | $.ig.DataSource が受け入れる任意の有効なデータ ソース、または $.ig.DataSource 自体のインスタンスにすることができます。 |
はい。リモート要求を処理するバックエンドの URL に設定します。 |
type | フィルタリングのタイプを設定します。 | はい。remote に設定してリモート フィルタリングを有効にします。 |
filterExprUrlKey | リモート要求に対してフィルタリングの式をエンコードする方法を指定する URL キー名。たとえば、&filter('col') = startsWith 。デフォルトは OData です。 |
いいえ。設定しない場合、OData 規則がデフォルトで使用されます。 |
構成の例:
dataSource: "http://<server>/grid/GetData",
features: [
{ name: "Filtering", type: "remote", filterExprUrlKey: "filter" }
...
]
例で設定したフィルタリング要求によって生成された要求。たとえば:
http://<server>/grid/GetData?filter(OrderID)=equals(10273)
要求が送信されるバックエンドは以下を行います。
以下の例は、ASP.NET MVC アプリケーションに上記手順を適用する方法です。
C# の場合:
public JsonResult GetData() {
IEnumerable<Order> orders = RepositoryFactory.GetOrderRepository().Get().Take(200);
IQueryable data = orders.AsQueryable();
var filterExprs = Request.QueryString.AllKeys.Where(x => x.Contains("filter"));
if (filterExprs.Count() != 0)
{
data = ApplyFilterExpr(Request.QueryString, data);
}
JsonResult result = new JsonResult();
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
result.Data = data;
return result;
}
private IQueryable ApplyFilterExpr(NameValueCollection queryString, IQueryable data)
{
List<FilterExpression> exprs = GetFilterExpressions(queryString);
StringBuilder builder = new StringBuilder();
int count = 0;
for (int i = 0; i < exprs.Count; i++)
{
if (count != 0 && count <= exprs.Count - 1)
{
builder.Append(exprs[i].Logic.ToLower() == "AND".ToLower() ? " AND " : " OR ");
}
count++;
string condition = exprs[i].Condition;
string expr = exprs[i].Expr;
string colKey = exprs[i].Key;
var dt = DateTime.Now;
switch (condition.ToLower())
{
case "startswith":
builder.Append(colKey + ".StartsWith(\"" + expr + "\")");
break;
case "contains":
builder.Append(colKey + ".Contains(\"" + expr + "\")");
break;
case "endswith":
builder.Append(colKey + ".EndsWith(\"" + expr + "\")");
break;
case "equals":
if (colKey == "ShipName") {
//col type is string
builder.Append(colKey + " == \"" + expr + "\"");
}
else
{
//col type is number
builder.Append(colKey + " == " + expr);
}
break;
case "doesnotequal":
if (colKey == "ShipName")
{
//col type is string
builder.Append(colKey + " != \"" + expr + "\"");
}
else
{
//col type is number
builder.Append(colKey + " != " + expr);
}
break;
case "doesnotcontain":
builder.Append("! " + colKey + ".Contains(\"" + expr + "\")");
break;
case "lessthan":
builder.Append(colKey + " < " + expr);
break;
case "greaterthan":
builder.Append(colKey + " > " + expr);
break;
case "lessthanorequalto":
builder.Append(colKey + " <= " + expr);
break;
case "greaterthanorequalto":
builder.Append(colKey + " >= " + expr);
break;
case "on":
dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(double.Parse(expr)).ToUniversalTime();
builder.Append("(" + colKey + ".Value.Day == " + dt.Day + " AND " + colKey +
".Value.Year == " + dt.Year + " AND " +colKey + ".Value.Month == " + dt.Month + ")");
break;
case "noton":
dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(double.Parse(expr)).ToUniversalTime();
builder.Append("!("+colKey + ".Value.Day == " + dt.Day + " AND " + colKey +
".Value.Year == " + dt.Year + " AND " + colKey + ".Value.Month == " + dt.Month + ")");
break;
case "after":
dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(double.Parse(expr)).ToUniversalTime();
builder.Append("((" + colKey + ".Value.Year > " + dt.Year + " OR (" +
colKey + ".Value.Month > " + dt.Month + " AND " + colKey + ".Value.Year == " + dt.Year + ") OR (" +
colKey + ".Value.Day > " + dt.Day + " AND " + colKey + ".Value.Year == " + dt.Year + " AND " +
colKey + ".Value.Month == " + dt.Month + ")))");
break;
case "before":
dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(double.Parse(expr)).ToUniversalTime();
builder.Append("((" + colKey + ".Value.Year < " + dt.Year + " OR (" +
colKey + ".Value.Month < " + dt.Month + " AND " + colKey + ".Value.Year == " + dt.Year + ") OR (" +
colKey + ".Value.Day < " + dt.Day + " AND " + colKey + ".Value.Year == " + dt.Year + " AND " +
colKey + ".Value.Month == " + dt.Month + ")))");
break;
case "today":
builder.Append("(" + colKey + ".Value.Day == " + DateTime.Now.Day + " AND " + colKey +
".Value.Year == " + DateTime.Now.Year + " AND " + colKey + ".Value.Month == " + DateTime.Now.Month + ")");
break;
case "yesterday":
DateTime yesterday = DateTime.Now.AddDays(-1);
builder.Append("(" + colKey + ".Value.Day == " + yesterday.Day + " AND " + colKey +
".Value.Year == " + yesterday.Year + " AND " + colKey + ".Value.Month == " + yesterday.Month + ")");
break;
case "thismonth":
builder.Append("(" + colKey + ".Value.Year == " + DateTime.Now.Year + " AND " + colKey + ".Value.Month == " + DateTime.Now.Month + ")");
break;
case "lastmonth":
builder.Append("(" + colKey + ".Value.Year == " + (DateTime.Now.Year - 1) + " AND " + colKey + ".Value.Month == " + (DateTime.Now.Month - 1) + ")");
break;
case "nextmonth":
builder.Append("(" + colKey + ".Value.Year == " + (DateTime.Now.Year - 1) + " AND " + colKey + ".Value.Month == " + (DateTime.Now.Month + 1) + ")");
break;
case "thisyear":
builder.Append(colKey + ".Value.Year == " + DateTime.Now.Year);
break;
case "lastyear":
builder.Append(colKey + ".Value.Year == " + (DateTime.Now.Year - 1));
break;
case "nextyear":
builder.Append(colKey + ".Value.Year == " + (DateTime.Now.Year + 1));
break;
default:
break;
}
}
if (builder.Length > 0) {
data = data.Where(builder.ToString(), new object[0]);
}
return data;
}
このセクションは、リモート並べ替えの構成および処理の手順について説明します。GroupBy に適用されるデータ操作はデータの並べ替えのみであるため、同じ手順が GroupBy に適用されます。
手順:
以下の表は、バックエンドからの応答を手動で処理する場合に設定する必要のある、リモート並べ替えに影響するオプションの一覧です。
オプション | 説明 | 必須 |
---|---|---|
dataSource | $.ig.DataSource が受け入れる任意の有効なデータ ソース、または $.ig.DataSource 自体のインスタンスにすることができます。 |
はい。リモート要求を処理するバックエンドの URL に設定します。 |
type | 並べ替えのタイプを設定します。 | はい。remote に設定してリモート並べ替えを有効にします。 |
sortUrlKey | 並べ替えの式を URL 内でエンコードする方法を指定する URL パラメーター名。例: ?sort(col1)=asc。 | いいえ。設定しない場合、OData 規則がデフォルトで使用されます。 |
sortUrlKeyAscValue | 昇順の並べ替えの URL パラメーター値。例: ?sort(col1)=asc。 | いいえ。設定しない場合、OData 規則がデフォルトで使用されます。 |
sortUrlKeyDescValue | 降順の並び替えの URL パラメーター値。例: ?sort(col1)=desc. | いいえ。設定しない場合、OData 規則がデフォルトで使用されます。 |
構成の例:
dataSource: "http://<server>/grid/GetData",
features: [
{
name: "Sorting",
type: "remote",
sortUrlKey: 'sort',
sortUrlKeyAscValue: 'asc',
sortUrlKeyDescValue: 'desc'
}
...
]
例で設定した並べ替え要求によって生成された要求。たとえば:
http://<server>/grid/GetData?sort(OrderID)=asc
要求が送信されるバックエンドは以下を行います。
以下の例は、ASP.NET MVC アプリケーションに上記手順を適用する方法です。
C# の場合:
public JsonResult GetData() {
IEnumerable<Order> orders = RepositoryFactory.GetOrderRepository().Get().Take(200);
IQueryable data = orders.AsQueryable();
var sortExprs = Request.QueryString.AllKeys.Where(x => x.Contains("sort"));
if (sortExprs.Count() != 0) {
data = ApplySorting(Request.QueryString, data);
}
JsonResult result = new JsonResult();
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
result.Data = data;
return result;
}
private IQueryable ApplySorting(NameValueCollection queryString, IQueryable data)
{
List<SortExpression> sortExpressions = BuildSortExpressions(queryString, "sort", false);
string orderBy = "OrderBy";
string orderByDescending = "OrderByDescending";
foreach (SortExpression expr in sortExpressions)
{
data = ApplyOrder(data, expr.Key, expr.Mode == SortMode.Ascending ? orderBy : orderByDescending);
orderBy = "ThenBy";
orderByDescending = "ThenByDescending";
}
return data;
}
public List<SortExpression> BuildSortExpressions(NameValueCollection queryString, string sortKey, bool isTable)
{
List<SortExpression> expressions = new List<SortExpression>();
List<string> sortKeys = new List<string>();
foreach (string key in queryString.Keys)
{
if (!string.IsNullOrEmpty(key) && key.StartsWith(sortKey))
{
SortExpression e = new SortExpression();
e.Key = key.Substring(key.IndexOf("(")).Replace("(", "").Replace(")", "");
e.Logic = "AND";
e.Mode = queryString[key].ToLower().StartsWith("asc") ? SortMode.Ascending : SortMode.Descending;
expressions.Add(e);
sortKeys.Add(key);
}
}
if (sortKeys.Count > 0 && isTable)
{
foreach (string sortedKey in sortKeys)
{
queryString.Remove(sortedKey);
}
string url = Request.Url.AbsolutePath;
string updatedQueryString = "?" + queryString.ToString();
Response.Redirect(url + updatedQueryString);
}
return expressions;
}
このセクションは、リモート集計の構成および処理の手順について説明します。
手順:
以下の表は、バックエンドからの応答を手動で処理する場合に設定する必要のある、リモート集計に影響するオプションの一覧です。
オプション | 説明 | 必須 |
---|---|---|
responseDataKey | データ レコードが保持される応答内のプロパティ。 | はい |
dataSource | $.ig.DataSource が受け入れる任意の有効なデータ ソース、または $.ig.DataSource 自体のインスタンスにすることができます。 |
はいリモート要求を処理するバックエンドの URL に設定します。 |
type | 集計のタイプを設定します。 | はい。remote に設定してリモート集計を有効にします。 |
summariesResponseKey | リモート データ ソースによって返された結果からデータを取得する結果キー。 | いいえ。デフォルトは "summaries" です。 |
summaryExprUrlKey | 集計の GET 要求にキーを設定します (タイプがリモートの場合にのみ使用)。 | いいえ。デフォルトは "summaries" です。 |
構成の例:
dataSource: "http://<server>/grid/GetData",
responseDataKey: "Records",
features: [
{ name: "Summaries", type:"remote"}
...
]
例で設定した集計要求によって生成された要求。たとえば:
http://<server>/grid/GetData?summaries(OrderID)=count,min,max,sum,avg
要求が送信されるバックエンドは以下を行います。
{
Records: <data>,
"Metadata": {
"Summaries": {
"OrderID": {
"count": 100
}
}
}
}
このトピックに関連する追加情報については、以下のトピックを参照してください。
オンラインで表示: GitHub