Mine is a MVC project. From my view am making a AJAX call to get the JSON data. From my controller when i deseralize my class using javascriptDeserializer, i get below
{
"page":1,
"total":2,
"records":2,
"rows":[
{"id":1,"cell":["ToolVersion","1","ESP","1.2","2/2/2013"]},
{"id":2,"cell":["ToolVersion","2","OPT","1.3","3/3/2013"]}
]
}
The action method as below
var lst = obj.GetDetails(); // this returns the instance of MyCustomJQGrid class.
return Json(new
{
total = 2,
page = 1,
records = 2,
rows = lst.rows.ToArray()
}, JsonRequestBehavior.AllowGet);
public class MyCustoMJQGrid
{
public class Row
{
public int id { get; set; }
public List<string> cell { get; set; }
public Row()
{
cell = new List<string>();
}
}
public int page { get; set; }
public int total { get; set; }
public int records { get; set; }
public List<Row> rows { get; set; }
public JQGrid()
{
rows = new List<Row>();
}
}
in view, am using below code
$('#list2').jqGrid({
url: '#(Url.Action("GetToolVersionDetails", "Admin"))',
datatype: 'json',
colNames: ['TableName','RowId', 'ColA', 'ColB', 'ColC'],
mtype: 'GET',
colModel: [
{ name: 'TableName', index: 'TableName', width: 150 },
{ name: 'RowId', index: 'RowId', width: 150 },
{ name: 'ColA', index: 'ColA', width: 250 },
{ name: 'ColB', index: 'ColB', width: 250 },
{ name: 'ColC', index: 'ColC', width: 250 }
],
jsonReader: {
root: 'rows',
total: 'total',
page: 'page',
records: 'records',
cell: 'cell',
id: 'id',
repeatitems: false
},
rowNum: 10,
rowList: [5, 10, 20, 30],
pager: $('#gridpager'),
sortname: 'RowId',
viewrecords: true,
sortorder: 'asc',
caption: 'Tool Version',
shrinkToFit: true,
width: $('#gridContainer').width(),
height: 200,
hidegrid: false,
});
jqgrid is getting displayed with two empty rows. no data is displayed. it just shows a blank table with two rows. JSON data is not getting displayed.
Kindly help.
Thanks.
I suggest you to install and use MvcJqGrid nuget package, to have a full featured fluent grid solution with mvc helpers.
It represents a repository class to select, filter and sort rows. It also represents a GridSettings type that you can simply use in your controller to put data rows into a json response and send it to the view.
Examples are here.
Codes for repository class are here. You also can find all other required codes there
Related
I have created MVC 5 (with Razor syntax) in which I would like to display data using morris-area-chart. I would like to use data from the model (i.e. database) which I would pass into my View so that I can use it in morris-area-chart.
Could someone please show me how to construct and replace following morris-area-chart configuration elements data so these elements are set with data obtained from model instead?
data: [{ period: '2010-01-01', iphone: 2666, ipad: null, itouch: 2647 },
{ period: '2010-01-02', iphone: 2778, ipad: 2294, itouch: 2441 },
{ period: '2010-01-03', iphone: 4912, ipad: 1969, itouch: 2501 },
{ period: '2010-01-04', iphone: 3767, ipad: 3597, itouch: 5689 }],
labels: ['iPhone', 'iPad', 'iPod Touch'],
If using model and Razor syntax is not possible to achieve my above request then please demonstrate the correct method to display data from model (i.e. database).
View:
#model Project.Models.ShowGraphViewModel
....
<div id="morris-area-chart"></div>
#section Styles {
#Styles.Render("~/plugins/morrisStyles")
}
#section Scripts {
#Scripts.Render("~/plugins/morris")
<script>
Morris.Area({
element: 'morris-area-chart',
data: [{ period: '2010-01-01', iphone: 2666, ipad: null, itouch: 2647 },
{ period: '2010-01-02', iphone: 2778, ipad: 2294, itouch: 2441 },
{ period: '2010-01-03', iphone: 4912, ipad: 1969, itouch: 2501 },
{ period: '2010-01-04', iphone: 3767, ipad: 3597, itouch: 5689 }],
xkey: 'period',
ykeys: ['iphone', 'ipad', 'itouch'],
labels: ['iPhone', 'iPad', 'iPod Touch'],
xLabels: "day",
pointSize: 2,
hideHover: 'auto',
resize: true,
lineColors: ['#87d6c6', '#54cdb4', '#1ab394'],
lineWidth: 2,
pointSize: 1,
});
</script>
}
Controller:
// GET: ShowGraph
public ActionResult ShowGraph()
{
// Create model to pass to View
ShowGraphViewModel graphModel = new ShowGraphViewModel();
// How to construct following for morris-area-chart?
// data: ?.....
// labels = ?....
return View(graphModel);
}
Model:
public class ShowGraphViewModel
{
//What do I put in here?
}
You view model needs 2 properties IEnumerable<string> Labels and IEnumerable<T> Data where T is a model containing properties for period, iphone etc. For example
public class ChartDataVM
{
public string period { get; set; }
public int iphone { get; set; }
public int? ipad { get; set; }
public int itouch{ get; set; }
}
public class ShowGraphViewModel
{
public IEnumerable<ChartDataVM> Data { get; set; }
public IEnumerable>string> Labels { get; set; }
}
and in the GET method, you might generate it using
var model = new ShowGraphViewModel()
{
Data = new List<ChartDataVM>
{
new ChartDataVM(){ period "2010-01-01", iphone = 2666, itouch = 2647 },
new ChartDataVM(){ period "2010-01-02", .... },
....
},
Labels = new List<string>(){ "iPhone", "iPad", .... }
};
return View(model);
Then in the view you can assign the model to a javascript object and assign its properties to your plugin
<script>
var model = #Html.Raw(Json.Encode(Model))
Morris.Area({
element: 'morris-area-chart',
data: model.Data,
xkey: 'period',
....
labels: model.Labels,
....
The view model could also contain other properties needed by the plugin such as List<string> LineColors
Got a nice JSON problem over here;
I don't know how to go about formatting date, timespan, decimals etc before sending it to the view in MVC. I'm using the datatables jQuery plugin, and my 'DataHandler' method returns a JSON object as source for the datatable.
When I was processing the data and filtering client-side it was pretty straightforward, but now I'm processing the data on the server-side.
Controller:
public JsonResult DataHandler(DTParameters param)
{
try
{
var dtsource = new List<spRegistrations_Result>();
using (entities dc = new entities())
{
dtsource = dc.spRegistrations().ToList();
}
List<String> columnSearch = new List<string>();
foreach (var col in param.Columns)
{
columnSearch.Add(col.Search.Value);
}
List<spRegistrations_Result> data = new ResultSet().GetResult(param.Search.Value, param.SortOrder, param.Start, param.Length, dtsource, columnSearch);
int count = new ResultSet().Count(param.Search.Value, dtsource, columnSearch);
DTResult<spRegistrations_Result> result = new DTResult<spRegistrations_Result>
{
draw = param.Draw,
data = data,
recordsFiltered = count,
recordsTotal = count
};
return Json(result);
}
catch (Exception ex)
{
return Json(new { error = ex.Message });
}
}
Table initialization:
var table = $('#myTable').DataTable({
responsive: true,
"serverSide": true,
"ajax": {
"type": "POST",
"url": '/Table/DataHandler',
"contentType": 'application/json; charset=utf-8',
'data': function (data) { return data = JSON.stringify(data); }
},
"drawCallback": function(settings){
$('.card').hide();
},
"paging": true,
"deferRender": true,
"columns": [
{ "data": "RegId" },
{ "data": "PresenceDate" }, etc...
Model:
public int RegId { get; set; }
public System.TimeSpan StartTime { get; set; }
public System.TimeSpan EndTime { get; set; }
public System.DateTime PresenceDate { get; set; }
This is how it looks when the table is displayed
As you can see, the date is not very nicely formatted, and is the reason that I want to format the data before displaying it. Same goes for a couple of TimeSpan objects etc that I eventually want to show in the table.
I'm still pretty new to ajax, and don't know how to go about this the easiest way. Thanks for any input !
You could use the columns.render property to define the content of the table cell, using a custom js function to format the date. Something like:
...
"render": function ( data, type, full, meta ) {
var date = new Date(parseInt(data.substr(6), 0));
return ISODateString(date);
}
The function to format the date dd/mmm/yyyy:
function ISODateString(d) {
function pad(n) { return n < 10 ? '0' + n : n }
return pad(d.getDate()) + '/' + pad(d.getMonth() + 1) + '/' + d.getFullYear();
}
I have problem with rendering jqGrid in ASP.net MVC 3.
Responsibility of ProductInfo action is to display list of product along with other latest product information (in ProductInfo view). When user click on any product link, ProductModelList action fetch all modellist of selected product & pass it to ProductModelList view where all jqGrid codes is written. But It renders row json data in browser as given bellow
{"total":null,"page":null,"records":9,"rows":[{"id":4,"cell":["3","Hyundai Accent"]},{"id":5,"cell":["3","Hyundai Santro"]},{"id":6,"cell":["3","Hyundai Santa Fe"]},{"id":7,"cell":["3","Hyundai i10"]},{"id":8,"cell":["3","Hyundai i20"]},{"id":9,"cell":["3","Hyundai Tucson"]},{"id":10,"cell":["3","Hyundai Verna Fluidic"]},{"id":11,"cell":["3","Hyundai EON"]},{"id":12,"cell":["3","New Hyundai Sonata"]}]}
following are controller and view:
public class Product : Controller
{
**//used to view product list**
public ActionResult ProductInfo()
{
ViewBag.ModelNameList = ModelRepository.GetModelName();
ViewBag.ModelVersionNameList = ModelVersionRepository.GetModelVersionName();
return View(new NewCarSearchContainer());
}
**//used to view modellist using jgGrid**
public JsonResult ProductModelList(int brandId, string sidx, string sord, int? page, int? rows)
{
var result = new
{
total = (ModelRepository.GetModelByBrandId(brandId).Count() + rows - 1) / rows,
page = page,
records = ModelRepository.GetModelByBrandId(brandId).Count(),
rows = (from model in ModelRepository.GetModelByBrandId(brandId)
select new
{
id = model.ModelId,
cell = new string[] { model.BrandId.ToString(), model.ModelName }
}).ToList()
};
return Json(result, JsonRequestBehavior.AllowGet);
}
}
ProductModelList View:
=====================
<table id="jqgProducts">
</table>
<div id="jqgpProducts">
</div>
<script type="text/javascript">
$(document).ready(function () {
$('#jqgProducts').jqGrid({
//url from wich data should be requested
url: '/Product/ProductModelList',
//type of data
datatype: 'json',
//url access method type
mtype: 'GET',
//columns names
colNames: ['id', 'ModelId', 'BrandName'],
//columns model
colModel: [
{ name: 'id', index: 'id', width: 40, align: 'left' },
{ name: 'ModelId', index: 'ModelId', width: 40, align: 'left' },
{ name: 'BrandName', index: 'BrandName', width: 40, align: 'left' },
],
//pager for grid
pager: $('#jqgpProducts'),
//number of rows per page
rowNum: 10,
//initial sorting column
sortname: 'ModelId',
//initial sorting direction
sortorder: 'asc',
//we want to display total records count
viewrecords: true,
//grid height
height: '100%'
});
});
</script>
Please guide me?
Thanks,
Paul
The 'id' from the JSON data will be used to assign id attribute of the rows of the grid (id of <tr> elements). The ids must be unique on the page. All your current data contains the same id (id=3).
I would recommend you to download some working example (see the answer or this one) and modify it corresponds to your requirements.
I'm using ExtJS4 to develop some rich interfaces. I'm a beginner with ExtJS and I i have some problems. I have 100 records and I want to show 20 records per page. I have done this code, but its only showing 20 recording in all pages. I have verified in firebug if I have all my data: I have only 20 and my Total is equal to 100. I need help please.
Webservice page:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class Service : System.Web.Services.WebService
{
public class DataGridSource
{
public List<MyDvpt> maListe = new List<MyDvpt>();
private int _total;
public int Total
{
get { return _total; }
set { _total = value; }
}
}
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)]
public DataGridSource GetMyDvpt3(int pageSize, int pageNumber)
{
string connectionString = "Data source=DARWIN;Initial Catalog=AGREO_DVPT;User ID=temp;Password=pmet";
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand("SELECT TOP 100 E.NOM_EXP,ESP.NOM_ESP,V.NOM_VAR,P.SURF_PG,P.DD_CYCLE_PROD from gc.PG P inner join ADM.EXP E on E.ID_EXP = P.ID_EXP inner join GC.VAR V on V.ID_VAR = P.ID_VAR inner join GC.ESP ESP on ESP.ID_ESP = V.ID_ESP", connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
List<MyDvpt> list1 = new List<MyDvpt>();
while (reader.Read())
{
MyDvpt dev = new MyDvpt();
dev.NOM_EXP = reader[0].ToString();
dev.NOM_ESP = reader[1].ToString();
dev.NOM_VAR = reader[2].ToString();
dev.SURF_PG = reader[3].ToString();
dev.DD_CYCLE_PROD = reader[4].ToString();
list1.Add(dev);
}
return new DataGridSource { maListe = list1.Skip(pageSize * pageNumber).Take(pageSize).ToList<MyDvpt>(), Total = list1.Count };
}
public class MyDvpt
{
public string NOM_EXP { get; set; }
public string NOM_ESP { get; set; }
public string NOM_VAR { get; set; }
public string SURF_PG { get; set; }
public string DD_CYCLE_PROD { get; set; }
private string _total;
public string Total
{
get { return _total; }
set { _total = value; }
}
}
}
JS page:
function onReady() {
store = new Ext.data.JsonStore({
autoLoad: true,
pageSize: 20,
pageNumber: 1,
groupField: 'NOM_VAR',
proxy: ({
type: 'ajax',
url: '../Service.asmx/GetMyDvpt3?pageSize=20 &pageNumber=1',
reader: {
type: 'json',
root: 'd.maListe',
totalProperty: 'd.Total'
},
headers: {
'Content-type': 'application/json'
}
}),
fields: ['NOM_EXP', 'NOM_ESP', 'NOM_VAR', 'SURF_PG', 'DD_CYCLE_PROD']
});
store.loadPage(1);
var groupingFeature = Ext.create('Ext.grid.feature.Grouping', {
groupHeaderTpl: 'NOM_VAR: {NOM_ESP} ({rows.length} enregistrement{[values.rows.length > 1 ? "s" : ""]})'
});
Ext.create('Ext.grid.Panel', {
store: store,
id:'grid',
collapsible: true,
frame: true,
iconCls: 'icon-grid',
features: [groupingFeature],
columnLines: true,
columns: [
{ dataIndex: 'NOM_EXP', header: 'NOM_EXP', flex: 1 },
{ dataIndex: 'NOM_ESP', header: 'NOM_ESP', flex: 1 },
{ dataIndex: 'NOM_VAR', header: 'NOM_VAR', flex: 1 },
{ dataIndex: 'SURF_PG', header: 'SURF_PG', flex: 1 },
{ dataIndex: 'DD_CYCLE_PROD', header: 'DD_CYCLE_PROD', flex: 1 }
],
fbar: ['->', {
text: 'Clear Grouping',
iconCls: 'icon-clear-group',
handler: function () {
groupingFeature.disable();
}
}],
renderTo: 'panel',
viewConfig: {
stripeRows: true
},
title: 'Dvpt Grid',
width: 1220,
height: 500,
dockedItems: [{
xtype: 'pagingtoolbar',
store: store,
dock: 'bottom',
displayInfo: true
}]
});
}
store.load() response in firebug:
GET http://localhost:1508/Service.asmx/GetMyDvpt3?pa...22NOM_VAR%22%2C%22direction%22%3A%22ASC%22%7D%5D
{"d":{"_type":"MaquetteExtJs.Service+DataGridSource","maListe":[{"_type":"MaquetteExtJs.Service+MyDvpt","NOM_EXP":"DECKERT","NOM_ESP":"Blé Dur Hiver","NOM_VAR":"AMBRAL","SURF_PG":"30000","DD_CYCLE_PROD":"26/02/2003 00:00:00","Total":null},
...
{"__type":"MaquetteExtJs.Service+MyDvpt","NOM_EXP":"DECKERT","NOM_ESP":"Blé Dur Hiver","NOM_VAR":"SOLDUR","SURF_PG":"25000","DD_CYCLE_PROD":"06/03/2002 00:00:00","Total":null}],"Total":"100"}}
d Object { __type="MaquetteExtJs.Service+DataGridSource", maListe=[20], Total="100"}
Currently your response is like this...
{"d":{"_type":"MaquetteExtJs.Service+DataGridSource","maListe":[{"_type":"MaquetteExtJs.Service+MyDvpt","NOM_EXP":"DECKERT","NOM_ESP":"Blé Dur Hiver","NOM_VAR":"AMBRAL","SURF_PG":"30000","DD_CYCLE_PROD":"26/02/2003 00:00:00","Total":null}, ... {"__type":"MaquetteExtJs.Service+MyDvpt","NOM_EXP":"DECKERT","NOM_ESP":"Blé Dur Hiver","NOM_VAR":"SOLDUR","SURF_PG":"25000","DD_CYCLE_PROD":"06/03/2002 00:00:00","Total":null}],"Total":"100"}}
But it should be like this...
{"_type":"MaquetteExtJs.Service+DataGridSource","maListe":[{"_type":"MaquetteExtJs.Service+MyDvpt","NOM_EXP":"DECKERT","NOM_ESP":"Blé Dur Hiver","NOM_VAR":"AMBRAL","SURF_PG":"30000","DD_CYCLE_PROD":"26/02/2003 00:00:00","Total":null}, ... {"__type":"MaquetteExtJs.Service+MyDvpt","NOM_EXP":"DECKERT","NOM_ESP":"Blé Dur Hiver","NOM_VAR":"SOLDUR","SURF_PG":"25000","DD_CYCLE_PROD":"06/03/2002 00:00:00","Total":null}],"Total":"100"}
Also you need to update your JsonReader config in your JsonStore..
proxy: ({
type: 'ajax',
url: '../Service.asmx/GetMyDvpt3?pageSize=20 &pageNumber=1',
reader: {
type: 'json',
root: 'maListe',
totalProperty: 'Total'
}
}),
Try keeping old json response and store root property (root: 'd.maListe') and modify the totalProperty : 'Total'
Ohoy there!
I've been struggling with this problem for days, and I'm really starting to loose my temper about this!
I had managed to get informations parsed back to the grid, which can be sorted, but when I'm trying filtering the results, it gets a little bit messy..
I have been programming C# for about 4-5 months, but my Web Forms, Javascript and JQuery (including JSON) is only about 14 days or so, so maybe it's something very basics I do wrong - please be!!
First, I'm wondering if this is the correct JSON-syntax?
{"grid":{"_search":true,"nd":1291150141196,"rows":20,"page":1,"sidx":"Name","sord":"asc","filters":"{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"Phone\",\"op\":\"eq\",\"data\":\"2343444\"}]}"}}
Those backslashes seems incorrect to me, and I've tried filtering them at server side, but no luck - again, only 14 days of experience.
Error message:
"System.InvalidOperationException"
"Cannot convert object of type 'System.String' to type 'Filter'"
" at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)"
My WebMethod:
[WebMethod]
[ScriptMethod]
public string GetAll(GridSettings grid) {
var query = from p in dc.Customers select p;
//if (grid._search)
// if (grid.filters.groupOp == "AND")
// {
// foreach (var rule in grid.filters.Rules)
// query = query.Where<Customers>(rule.field, rule.data, rule.oper);
// }
// else if (grid.filters.groupOp == "OR")
// {
// var temp = (new List<Customers>()).AsQueryable();
// foreach (var rule in grid.filters.Rules)
// {
// var t = query.Where<Customers>(rule.field, rule.data, rule.oper);
// temp = temp.Concat<Customers>(t);
// }
// query = temp.Distinct<Customers>();
// }
query = query.OrderBy<Customers>(grid.sidx, grid.sord);
List<Customer> result = new List<Customer>();
foreach (var x in query)
{
Customer y = new Customer();
y.Phone = x.Phone;
y.Name = x.Name;
y.Address = x.Address;
y.Postal = x.Postal;
y.City = x.City;
y.Date = x.Date.ToString("dd-MM-yy");
result.Add(y);
}
return JsonConvert.SerializeObject(new PagedList(result, result.Count(), 1, 20));
}
}
Even through I don't think it's necessarily, (server side don't filter atm.):
public class Customer
{
public string Phone { get; set; }
public string Name { get; set; }
public string Address { get; set;}
public string Postal { get; set; }
public string City { get; set; }
public string Date { get; set; }
}
public class GridSettings
{
public bool _search { get; set; }
public Filter filters { get; set; }
public long nd { get; set; }
public int rows { get; set; }
public int page { get; set; }
public string sidx { get; set; }
public string sord { get; set; }
}
public class Filter
{
public string groupOp { get; set; }
public Rule[] Rules { get; set; }
public static Filter Create(string json)
{
try
{
return JsonConvert.DeserializeObject<Filter>(json);
}
catch
{
return null;
}
}
}
public class Rule
{
private Dictionary<string, WhereOperation> operations = new Dictionary<string, WhereOperation> {
{ "eq",WhereOperation.Equal },
{ "ne",WhereOperation.NotEqual },
{ "cn",WhereOperation.Contains }
};
public string field { get; set; }
public string op { set; get; }
public WhereOperation oper { get { return operations[op]; } }
public string data { get; set; }
}
public static class LinqExtensions
{
public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string sortColumn, string direction)
{
ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
MemberExpression memberAccess = null;
string methodName = string.Format("OrderBy{0}", direction.ToLower() == "asc" ? "" : "descending");
foreach (var property in sortColumn.Split('.'))
{
memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
}
LambdaExpression orderByLambda = Expression.Lambda(memberAccess, parameter);
MethodCallExpression result = Expression.Call(
typeof(Queryable),
methodName,
new[] { query.ElementType, memberAccess.Type },
query.Expression,
Expression.Quote(orderByLambda));
return query.Provider.CreateQuery<T>(result);
}
public static IQueryable<T> Where<T>(this IQueryable<T> query, string column, object value, WhereOperation operation)
{
try
{
if (string.IsNullOrEmpty(column))
return query;
ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
MemberExpression memberAccess = null;
foreach (var property in column.Split('.'))
memberAccess = Expression.Property(memberAccess ?? (parameter as Expression), property);
if (memberAccess == null)
return query.Where(p => true);
Expression conditional = Expression.Call(null, typeof(LinqExtensions).GetMethod("Comparer"), Expression.Convert(memberAccess, typeof(object)), Expression.Convert(Expression.Constant(value), typeof(object)), Expression.Constant(operation));
MethodCallExpression result = Expression.Call(typeof(Queryable), "Where", new[] { query.ElementType }, query.Expression, Expression.Lambda(conditional, parameter));
return query.Provider.CreateQuery<T>(result);
}
catch
{
return query.Where(p => true);
}
}
public static bool Comparer(this object value1, object value2, WhereOperation operation)
{
string strValue1 = value1.ToString().ToLowerInvariant().Trim();
string strValue2 = value2.ToString().ToLowerInvariant().Trim();
double dblValue1 = -1;
double dblValue2 = -1;
bool areNumbers = double.TryParse(strValue1, out dblValue1) && double.TryParse(strValue2, out dblValue2);
switch (operation)
{
case WhereOperation.Equal:
return areNumbers ? dblValue1 == dblValue2 : strValue1 == strValue2;
case WhereOperation.NotEqual:
return areNumbers ? dblValue1 != dblValue2 : strValue1 != strValue2;
case WhereOperation.Contains:
return strValue1.Contains(strValue2);
}
return true;
}
}
public enum WhereOperation
{
Equal, NotEqual, Contains
}
public class StringValueAttribute : System.Attribute
{
private string _value;
public StringValueAttribute(string value)
{
_value = value;
}
public string Value
{
get { return _value; }
}
}
public class PagedList
{
IEnumerable _rows;
int _totalRecords;
int _pageIndex;
int _pageSize;
object _userData;
public PagedList(IEnumerable rows, int totalRecords, int pageIndex, int pageSize, object userData)
{
_rows = rows;
_totalRecords = totalRecords;
_pageIndex = pageIndex;
_pageSize = pageSize;
_userData = userData;
}
public PagedList(IEnumerable rows, int totalRecords, int pageIndex, int pageSize)
: this(rows, totalRecords, pageIndex, pageSize, null)
{
}
public int total { get { return (int)Math.Ceiling((decimal)_totalRecords / (decimal)_pageSize); } }
public int page { get { return _pageIndex; } }
public int records { get { return _totalRecords; } }
public IEnumerable rows { get { return _rows; } }
public object userData { get { return _userData; } }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
Any finally Javascript:
$(function () {
$("#CustomerList").dialog({
autoOpen: false,
show: "explode",
width: 720,
height: 450,
open: function () {
$("#CustomerListTable").jqGrid({
datatype: function (pdata) { getListData(pdata, 'Customers', '#CustomerListTable'); },
colNames: ['Telefon', 'Navn', 'Adresse', 'Post', 'By', 'CVR'],
colModel: [
{ name: 'Phone', width: 70, sortable: true, searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'Name', width: 200, sortable: true, searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'Address', width: 200, sortable: true, searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'Postal', width: 60, sortable: true, searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'City', width: 100, sortable: true, searchoptions: { sopt: ['eq', 'ne', 'cn']} },
{ name: 'CVR', width: 70, sortable: true, searchoptions: { sopt: ['eq', 'ne', 'cn']} }
],
caption: "",
height: 360,
loadonce: true,
scroll: 1,
pager: '#CustomerListPager',
gridview: true,
sortname: 'Name',
sortorder: 'asc'
});
$("#CustomerListTable").jqGrid('navGrid', '#CustomerListPager', { del: false, add: false, edit: false }, {}, {}, {}, { multipleSearch: true });
}
});
});
function getListData(pdata, controller, table) {
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "Controls/" + controller + ".asmx/GetAll",
data: "{\"grid\":" + JSON.stringify(pdata) + "}",
dataType: "json",
success: function (data, textStatus) {
if (textStatus == "success") RecievedData(JSON.parse(getMain(data)).rows, table);
},
error: function (data, textStatus) {
alert("Error fetching data");
}
});
}
function RecievedData(data, table) {
var thegrid = $(table);
thegrid.clearGridData();
for (var i = 0; i < data.length; i++) thegrid.addRowData(i + 1, data[i]);
thegrid.removeClass("jqgrid-overlay");
}
function getMain(data) {
if (data.hasOwnProperty("d")) return data.d;
else return data;
}
The solution I have this far, is the result of hours and hours of Goggle, reading and experimenting... I'm going about to going nuts!!
Oh and while I'm here - why on earth does the jqGrid search-button show up X times in the #CustomerListPager, when closing / opening the dialog, and why doesn't it request the datas again? I have to refresh the page everytime - which mainly is the reason why I'm using JQuery - i want to avoid that ;)
Thanks for your time if you have read so far - I'm appreciating this!
Happy december!
Nicky.
I do it like this and it loads the data as well as search can be performed easily.
this is the function which is called to load the jqgrid
function FillGrid(WebMethodString, GridName, PagerName, columnModel, columnNames, header)
{
// debugger;
jQuery(GridName).GridUnload();
jQuery.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: WebMethodString,
data: '{}', //PageMethod Parametros de entrada
datatype: "json",
success: function(msg) {
$('#dvWait').css('display', 'block');
// Do interesting things here.
// debugger;
var mydata = jQuery.parseJSON(msg.d);
//console.log(mydata);
jQuery(GridName).jqGrid({
datatype: "local",
data: mydata,
colNames: columnNames,
colModel: columnModel,
pager: jQuery(PagerName),
rowNum: 25,
mtype: "GET",
pagination: true,
scrollOffset: 0,
rowList: [10, 20, 25],
sortname: "WorkOrderID",
scroll: 1,
sortorder: "desc",
multiselect: false,
viewrecords: true,
caption: header,
autowidth: true,
ignoreCase: true,
height: 580,
jsonReader: {
repeatItem: false,
root: function (obj) { return obj.d.rows; },
page: function (obj) { return obj.d.page; },
total: function (obj) { return obj.d.total; },
records: function (obj) { return obj.d.records; }
},
afterInsertRow: function(rowid, rowdata, rowelem) {
jQuery(GridName).setCell(rowid, 'WorkOrderID', '', '', { title: '', onclick: 'DisappearPopup(event);' });
jQuery(GridName).setCell(rowid, 'Requester', '', '', { title: '', onclick: 'DisappearPopup(event);' });
jQuery(GridName).setCell(rowid, 'AssignedTo', '', '', { title: '', onclick: 'DisappearPopup(event);' });
jQuery(GridName).setCell(rowid, 'SummaryText', '', '', { title: '', onclick: 'DisappearPopup(event);' });
jQuery(GridName).setCell(rowid, 'CreationDate', '', '', { title: '', onclick: 'DisappearPopup(event);' });
},
gridComplete: function() {
$('#dvMaintbl').css('visibility', 'visible');
$('#dvWait').css('display', 'none');
}
})
jQuery(GridName).jqGrid('navGrid', PagerName,
{
edit: false,
add: false,
del: false,
searchtext: 'Search',
refreshtext: 'Reload'
});
}
});
}
Add this code in .aspx page
<script type="text/javascript">
// debugger;
jQuery(document).ready(function() {
FillGrid('Json.asmx/GetAllTroubleTickets', '#grid', '#pager', "put your column model here", "put your column names here", "put header text here");
});
</script>
Following is my web service call:
Public Function GetAllTroubleTickets() As String
Dim strStatus As String = HttpContext.Current.Request.QueryString("status")
Dim page As Integer = 1
If HttpContext.Current.Request.Form("page") IsNot Nothing Then
page = Integer.Parse(HttpContext.Current.Request.Form("page").ToString())
End If
Dim rp As Integer = 1
If HttpContext.Current.Request.Form("rowNum") IsNot Nothing Then
rp = Integer.Parse(HttpContext.Current.Request.Form("rowNum").ToString())
End If
Dim start As Integer = ((Page - 1) * rp)
If (strStatus = Nothing) Then
strStatus = "2"
End If
Dim dsDatos As DataSet = GetAllTroubleTicketsclass("", "WorkOrderID asc", "1", "4000", "", Convert.ToInt16(strStatus))
Dim result As String = Jayrock.Json.Conversion.JsonConvert.ExportToString(dsDatos.Tables(0).Rows)
Return result
End Function