I am new to MVC3 Razor. How can I show data table data in webgrid ?
Below is what I have tried...
My Home Controller
Public Function List() As ActionResult
Dim dt1 As New DataTable
dt1.Columns.Add("Eno", GetType(Int32))
dt1.Columns.Add("Ename", GetType([String]))
dt1.Columns.Add("Salary", GetType([Double]))
dt1.Columns.Add("Deptno", GetType(Int32))
' Loading data into dt1, dt2:
Dim o1 As Object() = {1, "a", 50000.5, 10}
Dim o2 As Object() = {2, "b", 4000.5, 20}
Dim o3 As Object() = {3, "c", 10000.5, 10}
dt1.Rows.Add(o1)
dt1.Rows.Add(o2)
dt1.Rows.Add(o3)
dt1.AsEnumerable()
Dim columns = dt1.Columns.Cast(Of DataColumn)()
Dim wgrid As Web.Helpers.WebGrid
wgrid = New Web.Helpers.WebGrid(source:=columns, defaultSort:="Eno", rowsPerPage:=2)
Return View(wgrid)
End Function
My View
#ModelType System.Web.Helpers.WebGrid
<h1>Emp Details</h1>
<div id="grid">
#Model.GetHtml(tableStyle:="grid", headerStyle:="head", alternatingRowStyle:="alt", columns:={Model.Column("Eno")})
</div>
My Problem
I get an error message as "Column "Eno" does not exist."
what i need is i want to show the data in the webgrid as
---------------------------------
Eno Ename Salary Deptno
---------------------------------
1 a 50000.5 10
2 b 4000.5 20
3 c 10000.5 10
---------------------------------
please help me out on this.
You should return a List as your model to your view...
To start with you should have a class like the one shown below...
public class SomeDetails
{
public string Eno { get; set; }
public string Ename { get; set; }
public string Salary { get; set; }
public string Deptno { get; set; }
}
and your function should return a list of this class.
and then your view can have Model defined as a List of this class and then you can use your webgrid's code
i got the solution in another way
Dim dt1 As New DataTable
dt1.Columns.Add("Eno", GetType(Int32))
dt1.Columns.Add("Ename", GetType([String]))
dt1.Columns.Add("Salary", GetType([Double]))
dt1.Columns.Add("Deptno", GetType(Int32))
Dim o1 As Object() = {1, "a", 50000.5, 10}
Dim o2 As Object() = {2, "b", 4000.5, 20}
Dim o3 As Object() = {3, "c", 10000.5, 10}
dt1.Rows.Add(o1)
dt1.Rows.Add(o2)
dt1.Rows.Add(o3)
Dim skip As Integer = If(page.HasValue, page.Value - 1, 0)
Dim data = From row In dt1.AsEnumerable() Select New With {.value = row("intDepartmentID").ToString, .display = row("vchDepartment").ToString}
Dim grid = New Helpers.WebGrid(data, rowsPerPage:=10)
Dim htmlString = grid.GetHtml(tableStyle:="webgrid", htmlAttributes:=New With {.id = "DataTable"}, headerStyle:="webgrid-header", alternatingRowStyle:="webgrid-alternating-row", footerStyle:="webgrid-footer", selectedRowStyle:="webgrid-selected-row", rowStyle:="webgrid-row-style", columns:=grid.Columns(grid.Column("display", "Eno"), grid.Column("value", "Ename")))
Return Json(New With {.Data = htmlString.ToHtmlString(), .count = data.Count()}, JsonRequestBehavior.AllowGet)
and view
<div class="tablegridpanel">
<div id="div1">
</div>
</div>
<script type="text/javascript">
/* On pageload web grid is loaded */
$(document).ready(function () {
alert("hii");
PopulateGrid();
});
function PopulateGrid() {
$.getJSON("/Home/webGrid", null, function (d) {
if (d.count > 0) {
$("#DataTable").remove();
$("#div1").append(d.Data);
}
else {
$('#div1').hide();enter code here
}
var footer = createFooter(d.Count);
$("#DataTable tfoot a").live("click", function (e) {
e.preventDefault();
var data = {`enter code here`
page: $(this).text()
};
$.getJSON("/Home/webGrid", { page: data.page }, function (html) {
if (html.count > 0) {
$("#DataTable").remove();
$("#div1").append(html.Data);
// $('#DataTable thead').after(footer);
}
else {
$('#div1').hide();
}
});
});
});
}
function createFooter(d) {
var rowsPerPage = 5;
var footer = "<tfoot>";
for (var i = 1; i < (d + 1); i++) {
footer = footer + "<a href=#>" + i + "</a> ";
}
footer = footer + "</tfoot>";
// $("#DataTable thead").after(footer);
return footer;
}
</script>
Related
I want to display dynamic menu in asp.net core mvc layout page. in my database table has menuid and parentid from that i want to display nested menus. if anyone have solution please help me and if any other method for this give an example.
Model is given below:
public class Menu
{
public int Id { get; set; }
public string MenuText { get; set; }
public string Url { get; set; }
public int? ParentId { get; set; }
public bool Active { get; set; }
public List<Menu> List { get; set; }
}
I want to use this in my layout class .How can i use this?
db_class Connstring = new db_class();
public void ProcessRequest(HttpContext context)
{
var user_id = Convert.ToString(context.Request["Id"]);
var str_company = Convert.ToString(context.Request["str_company"]);
List<Menu> listMenu = new List<Menu>();
string query = #"SELECT TOP (100) PERCENT dbo.Privilege.Name AS MenuText, dbo.[Right].[Add], dbo.[Right].Edit, dbo.[Right].[Delete], dbo.[Right].[view], dbo.[Right].Status AS Active, dbo.Privilege.URL AS url,
dbo.Privilege.ParentID AS ParentId, dbo.[Right].PrivilegeID AS menu_id, dbo.[Right].UserID, dbo.Company.Code, dbo.Company.Name, dbo.Privilege.ID
FROM dbo.Privilege INNER JOIN
dbo.[Right] ON dbo.Privilege.ID = dbo.[Right].PrivilegeID INNER JOIN
dbo.Module ON dbo.Privilege.ModuleID = dbo.Module.ID INNER JOIN
dbo.Department ON dbo.Module.DepartmentID = dbo.Department.ID INNER JOIN
dbo.Company ON dbo.Department.CompanyID = dbo.Company.ID
WHERE (dbo.[Right].Status = 1) AND (dbo.[Right].UserID = '" + user_id.Trim() + "') AND (dbo.Company.Code = '" + str_company.Trim() + "') AND (dbo.Privilege.Platform = 'Web') AND (dbo.Module.Platform = 'Web') OR (dbo.[Right].Status = 1) AND(dbo.[Right].UserID = '" + user_id.Trim() + "') AND(dbo.Privilege.ParentID IS NULL) ORDER BY dbo.Privilege.Priority, dbo.Privilege.ID";
using (SqlConnection con = Connstring.getcon)
{
SqlCommand cmd = new SqlCommand(query);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Menu menu = new Menu();
menu.Id = Convert.ToInt32(rdr["menu_id"]);
menu.MenuText = rdr["MenuText"].ToString();
menu.ParentId = rdr["ParentId"] != DBNull.Value
? Convert.ToInt32(rdr["ParentId"]) : (int?)null;
menu.Url = rdr["url"].ToString();
menu.Active = Convert.ToBoolean(rdr["Active"]);
listMenu.Add(menu);
}
}
List<Menu> menuTree = GetMenuTree(listMenu, null);
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(menuTree));
}
public List<Menu> GetMenuTree(List<Menu> list, int? parent)
{
return list.Where(x => x.ParentId == parent).Select(x => new Menu
{
Id = x.Id,
MenuText = x.MenuText,
ParentId = x.ParentId,
Url = x.Url,
Active = x.Active,
List = GetMenuTree(list, x.Id)
}).ToList();
}
public bool IsReusable
{
get
{
return false;
}
}
Here is the javascript code :
var sl = 0;
function buildMenu(parent, items) {
$.each(items, function () {
//alert(this.MenuText);
//var icon = this.icon;
//if (icon == "") {
var icon = 'fa fa-circle-o';
//}
//------------------------------------//
if (this.List && this.List.length > 0) {
var pull_right = '</span><span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>';
icon = "glyphicon glyphicon-plus-sign";
}
else
pull_right = '';
//------------------------------------//
sl = sl + 1;
span_id = '';
if (this.Url != "") {
span_id = 'id="active_span_m' + sl + '"';
}
else {
span_id = '';
}
//-----------------------------------//
var li = $('<li id="m' + sl + '" onclick="set_menu_active(\'m' + sl + '\')" alt="' + this.Id + '" class="treeview"><i class="' + icon + '"></i><span ' + span_id + '>' + this.MenuText + pull_right + '</li>');
li.appendTo(parent);
if (this.List && this.List.length > 0) {
var ul = $('<ul class="treeview-menu menu-open"></ul>');
ul.appendTo(li);
buildMenu(ul, this.List);
}
});
//---------------Set Session---------------//
var str = $("<div />").append($("#menu").clone()).html();
sessionStorage.setItem("str_menu", str);
}
And Ajax:
$.ajax({
url: '../../../../../CDB/System/Common/Layout/Master/Permission.ashx',
method: 'get',
dataType: 'json',
data: { 'Id': u_s_id, 'str_company': str_company },
success: function (data) {
//alert(data);
buildMenu($('#menu'), data);
$('#menu').menu();
},
error: function (err) {
}
});
Output Image like as
Output image
Now i want to know process of use of this code in asp.net core mvc layout to get dynamic navigation menu
The list of doubles SC is of same size for all of CTable.
I would like add SC grouped by CTable.Ch. The result should be a List of sums. Is there an operator/customization for that?
Public Class SCRow
Public L As String
Public Ch As String
Public SC As List(Of Double)
End Class
Dim CTable AS New List(Of SCRow)
Dim AggrC =
From C In CTable
Group C By Key = C.Ch
Into Group
Select New With
{
.Ch= Key,
.SumSC = Group.Sum(Function(x) ???)
}
Example:
CTable.Add(New SCRow With {.L = "L1", .Ch = "Ch1", .SC = New List(Of Double)(New Double() {1.0, 2.0})})
CTable.Add(New SCRow With {.L = "L1", .Ch = "Ch2", .SC = New List(Of Double)(New Double() {3.0, 4.0})})
CTable.Add(New SCRow With {.L = "L2", .Ch = "Ch1", .SC = New List(Of Double)(New Double() {5.0, 6.0})})
Output:
Ch1 {6=1+5, 8=2+6}
Ch2 {3, 4}
It can be done using Aggregate extension method along with Zip method. I have written the code in C#. Please translate it to VB.Net. Hope it will help.
Aggregate: Performs a specified operation to each element in a collection, while carrying the result forward.
Zip: The Zip extension method acts upon two collections. It processes each element in two series together.
public class SCRow
{
public string L { get; set; }
public string CH { get; set; }
public List<double> SC { get; set; }
}
class Program
{
static void Main(string[] args)
{
var CTable = new List<SCRow>{
new SCRow { L = "L1", CH = "Ch1", SC = new List<double> { 1.0, 2.0}},
new SCRow { L = "L1", CH = "Ch2", SC = new List<double> { 3.0, 4.0}},
new SCRow { L = "L2", CH = "Ch1", SC = new List<double> { 5.0, 6.0}},
};
var result = CTable.GroupBy(c => c.CH)
.Select(x => new
{
Value = x.Aggregate((curr, next) => new SCRow
{
CH = x.Key,
SC = curr.SC.Zip(next.SC, (n1, n2) => n1 + n2).ToList()
})
})
.Select(y => new {
CH = y.Value.CH,
ScSum = y.Value.SC
}).ToList();
}
}
I would like to know the best way to compare 2 complex objects to know if they are equal by value, ie, their properties are the same? I tried the serialize method and not sure why they are not equal by value
Dim stream As New MemoryStream()
Dim bstream As New MemoryStream()
Dim clientOne As Jewellery.ClientInfo = New Jewellery.ClientInfo(New Jewellery.Company("a", "", "", "b", "", "e"), New Jewellery.Customer("a", "b", "c", "d", "", "", "", "f"))
Dim clientTwo As Jewellery.ClientInfo = New Jewellery.ClientInfo(New Jewellery.Company("a", "", "", "b", "", "e"), New Jewellery.Customer("a", "b", "c", "d", "", "", "", "f"))
formatter.Serialize(stream, clientOne)
formatter.Serialize(bstream, clientTwo)
Dim streamOneBytes As Byte() = stream.ToArray()
Dim streamTwoBytes As Byte() = bstream.ToArray()
Dim streamToCompareBytes As Byte() = streamToCompare.ToArray()
Dim i As Int16 = 0
Dim flag As Boolean
If streamOneBytes.Length <> streamTwoBytes.Length Then
MsgBox("False")
flag = False
Else
While i < streamOneBytes.Count
If streamOneBytes(i) <> streamTwoBytes(i) Then
flag = "False"
Else : flag = "True"
End If
i = i + 1
End While
End If
As you see in the above code, when I initialize 2 objects of the same type and compare, it works correctly. But when I add one object to say a List and then retrieve and compare to an object of similar type, it fails saying the binary width are different for both. Any advice? Thanks
public class IntegerPropertyEqualityCompare : IEqualityComparer<Main>
{
#region IEqualityComparer<Main> Members
public bool Equals( Main x, Main y )
{
return x.IntegerProperty == y.IntegerProperty;
}
public int GetHashCode( Main obj )
{
return obj.IntegerProperty.GetHashCode() ^ obj.StringProperty.GetHashCode();
}
#endregion
}
public class StringPropertyEqualityCompare : IEqualityComparer<Main>
{
#region IEqualityComparer<Main> Members
public bool Equals( Main x, Main y )
{
return x.StringProperty == y.StringProperty;
}
public int GetHashCode( Main obj )
{
return obj.IntegerProperty.GetHashCode() ^ obj.StringProperty.GetHashCode();
}
#endregion
}
public class AllPropertiesEqualityCompare : IEqualityComparer<Main>
{
#region IEqualityComparer<Main> Members
public bool Equals( Main x, Main y )
{
return ( x.IntegerProperty == y.IntegerProperty ) && ( x.StringProperty == y.StringProperty );
}
public int GetHashCode( Main obj )
{
return obj.IntegerProperty.GetHashCode() ^ obj.StringProperty.GetHashCode();
}
#endregion
}
public abstract class Main
{
public int IntegerProperty { get; set; }
public string StringProperty { get; set; }
public bool Equals( IEqualityComparer<Main> comparer, Main other )
{
return comparer.Equals( this, other );
}
}
public class ConcreteA : Main
{ }
public class ConcreteB : Main
{ }
class TemporaryTest
{
public static void Run()
{
var a = new ConcreteA();
a.IntegerProperty = 1;
a.StringProperty = "some";
var b = new ConcreteB();
b.IntegerProperty = 1;
a.StringProperty = "other";
Console.WriteLine( a.Equals( new IntegerPropertyEqualityCompare(), b ) );
Console.WriteLine( a.Equals( new StringPropertyEqualityCompare(), b ) );
Console.WriteLine( a.Equals( new AllPropertiesEqualityCompare(), b ) );
}
}
Maybe then somthing like this?
I'm not sure that I understand what you want to do.
So I go with IComparable<T>.
I'm trying to archive my search results for a term by
Using the Bing API in an async controller
Inserting them into database using Entity Framework
using the Bing API and insert them into a database using entity framework. For whatever reason it is returning 50 results, but then it enters 100 results into the database.
My Controller Code:
public class DHWebServicesController : AsyncController
{
//
// GET: /WebService/
private DHContext context = new DHContext();
[HttpPost]
public void RunReportSetAsync(int id)
{
int iTotalCount = 1;
AsyncManager.OutstandingOperations.Increment(iTotalCount);
if (!context.DHSearchResults.Any(xx => xx.CityMarketComboRunID == id))
{
string strBingSearchUri = #ConfigurationManager.AppSettings["BingSearchURI"];
string strBingAccountKey = #ConfigurationManager.AppSettings["BingAccountKey"];
string strBingUserAccountKey = #ConfigurationManager.AppSettings["BingUserAccountKey"];
CityMarketComboRun cityMarketComboRun = context.CityMarketComboRuns.Include(xx => xx.CityMarketCombo).Include(xx => xx.CityMarketCombo.City).First(xx => xx.CityMarketComboRunID == id);
var bingContainer = new Bing.BingSearchContainer(new Uri(strBingSearchUri));
bingContainer.Credentials = new NetworkCredential(strBingUserAccountKey, strBingAccountKey);
// now we can build the query
Keyword keyword = context.Keywords.First();
var bingWebQuery = bingContainer.Web(keyword.Name, "en-US", "Moderate", cityMarketComboRun.CityMarketCombo.City.Latitude, cityMarketComboRun.CityMarketCombo.City.Longitude, null, null, null);
var bingWebResults = bingWebQuery.Execute();
context.Configuration.AutoDetectChangesEnabled = false;
int i = 1;
DHSearchResult dhSearchResult = new DHSearchResult();
List<DHSearchResult> lst = new List<DHSearchResult>();
var webResults = bingWebResults.ToList();
foreach (var result in webResults)
{
dhSearchResult = new DHSearchResult();
dhSearchResult.BingID = result.ID;
dhSearchResult.CityMarketComboRunID = id;
dhSearchResult.Description = result.Description;
dhSearchResult.DisplayUrl = result.DisplayUrl;
dhSearchResult.KeywordID = keyword.KeywordID;
dhSearchResult.Created = DateTime.Now;
dhSearchResult.Modified = DateTime.Now;
dhSearchResult.Title = result.Title;
dhSearchResult.Url = result.Url;
dhSearchResult.Ordinal = i;
lst.Add(dhSearchResult);
i++;
}
foreach (DHSearchResult c in lst)
{
context.DHSearchResults.Add(c);
context.SaveChanges();
}
AsyncManager.Parameters["message"] = "The total number of results was "+lst.Count+". And there are " + context.DHSearchResults.Count().ToString();
}
else
{
AsyncManager.Parameters["message"] = "You have already run this report";
}
AsyncManager.OutstandingOperations.Decrement(iTotalCount);
}
public string RunReportSetCompleted(string message)
{
string str = message;
return str;
}
}
Here is how I am calling it from my asp.net mvc 4 page.
#Ajax.ActionLink("Run Report", "GatherKeywordsFromBing", "DHWebServices",
new { id=item.CityMarketComboRunID},
new AjaxOptions { OnSuccess = "ShowNotifier();", UpdateTargetId = "TopNotifierMessage", HttpMethod = "POST", InsertionMode = InsertionMode.Replace, LoadingElementId = strCityMarketComboProgressID, LoadingElementDuration = 1000 },
new { #class = "ViewLink" })
<span class="ProgressIndicator" id="#strCityMarketComboProgressID"><img src="#Url.Content("~/Content/img/SmallBall.gif")" alt="loading" /></span>
For whatever reason all of
Try saving only once:
foreach (DHSearchResult c in lst)
{
context.DHSearchResults.Add(c);
}
context.SaveChanges();
Also there's nothing asynchronous in your code, so there's no point of using asynchronous controller. Not only that it won't improve anything but it might make things worse.
Hi All i got a problem with dataview that get data from datatabel (Col1 : ID,Col2: Time)
and I'm sorting by Time in desc ... when the values for example {40.21,80.21,70.25,25.2} the dataview sorting them as I need but when one of values goes above 100 for example {40.21,80.21,100.25,25.2} the dataview always sort the highest number is the buttom, I don't know why .. This is a sample code
Dim dt As New DataTable
dt.Columns.Add("ID")
dt.Columns.Add("Time")
dt.Rows.Add(New String() {"1", "90.24"})
dt.Rows.Add(New String() {"2", "80.25"})
dt.Rows.Add(New String() {"3", "70.22"})
dt.Rows.Add(New String() {"4", "102.12"})
Dim dv As New DataView(dt)
dv.Sort = "Time Desc"
Thanks in advance ...
You are sorting a String, so what have you expected? "10000" is lower than "2" because "1" is alphabetically lower than "2" just as "abbbb" would be lower than "b".
You need to use the correct data-type(in this case i assume Double) to get the correct(numeric) sorting:
Dim dt As New DataTable
dt.Columns.Add("ID", GetType(Int32))
dt.Columns.Add("Time", GetType(Double))
dt.Rows.Add(1, 90.24)
dt.Rows.Add(2, 80.25)
dt.Rows.Add(3, 70.22)
dt.Rows.Add(4, 102.12)
Dim dv As New DataView(dt)
dv.Sort = "Time Desc"
Result:
4 102,12
1 90,24
2 80,25
3 70,22
Like Tim says, you are sorting by a string. I had to deal with a lot of mixed numbers and strings in multiple columns so I wrote a class to do the sorting (below). It properly sorts numbers as numbers, dates as dates and mixed number/string fields as users would expect.
I had columns with data like
"Day 1 Timepoint 1"
"Day 14 Timepoint 3"
"Day 15 Timepoint 10"
... And mixed numbers and dates.
The class takes a data table and a list of columns to include in the sort. Most important column first in the list, add as many columns as you want to the sort.
using System;
using System.Data;
using System.Linq;
public class DataTableSorter
{
public enum SortDirection
{
Ascending,
Descending
}
private const string MC_TEMP_COL_NAME = "SorterXXXColumn";
private const int MC_NUM_PAD_COLS = 12;
private static string msPAD = new string('0', MC_NUM_PAD_COLS);
public static DataTable SortTable(DataTable oDT, SortDirection eSortDir, params string[] asColumns)
{
//so DataView has limited sorting capability, this builds it out so numbers and strings work out well.
oDT.Columns.Add(new DataColumn(MC_TEMP_COL_NAME, typeof(string)));
foreach (DataRow oDR in oDT.Rows)
{
string sSortable = string.Empty;
foreach(string sCol in asColumns)
sSortable += Sortable(oDR[sCol]);
oDR[MC_TEMP_COL_NAME] = sSortable;
}
//Using DataView for sorting DataTable's data
using (DataView oSortedView = oDT.DefaultView)
{
oSortedView.Sort = string.Format("[{0}] {1}", MC_TEMP_COL_NAME, eSortDir == SortDirection.Ascending ? "ASC" : "DESC");
using (DataTable oDTreturn = oSortedView.ToTable())
{
//remove special sort column
oDTreturn.Columns.RemoveAt(oDTreturn.Columns.Count - 1);
return oDTreturn;
}
}
}
private static string Sortable(object oValue)
{
DateTime oDtT;
if (string.IsNullOrWhiteSpace(oValue.ToString()))
{
return string.Empty;
}
else if (DateTime.TryParse(oValue.ToString(), out oDtT))
{
System.Diagnostics.Debug.Print(oValue.ToString() + "\t" + String.Format("{0:yyyyMMddHHmmss.FFFF}", oDtT));
return string.Format("{0:yyyyMMddHHmmss.FFFF}", oDtT);
}
else
{
//pad out all numbers with lots of zeros, so that numbers sort as numbers.
char[] acVal = oValue.ToString().ToCharArray();
string sBuff = string.Empty;
string sRC = string.Empty;
bool bAfterDecmal = false;
int iCharCount = acVal.Length;
for (int i = 0; i < iCharCount; i++)
{
char c = acVal[i];
bool bIsNumeric = "0123456789".Contains(c);
bool bEndSection = false;
if (i == (iCharCount - 1))
{
bEndSection = true;
}
else
{
char cNext = acVal[i + 1];
if (bIsNumeric != "0123456789".Contains(cNext))
{
bEndSection = true;
}
else if (c == '.')
{
bEndSection = true;
bIsNumeric = false;
}
else if (cNext == '.')
{
bEndSection = true;
}
}
sBuff += c;
if (bEndSection)
{
if (bIsNumeric)
{
if (bAfterDecmal)
{
// FOR DECMALS, JUST RIGHT-PAD TO MC_NUM_PAD_COLS ZEROS:
sRC += (sBuff + msPAD).Substring(0, MC_NUM_PAD_COLS);
bAfterDecmal = true;
}
else
{
// for integers, left pad to MC_NUM_PAD_COLS zeros.
sRC += (msPAD + sBuff).Substring(sBuff.Length);
}
}
else
{
// upper case all strings, for better ordering.
sRC += sBuff.ToUpper();
}
sBuff = string.Empty;
} // CHANGE IN NUMERIC STATUS
if (c == '.')
bAfterDecmal = true;
}
System.Diagnostics.Debug.Print(oValue.ToString() + "\t" + sRC);
return sRC;
}
}
}
dt.Rows.Add(New String() {"1", "90.24"})
change it to
dt.Rows.Add(New Integer() {"1", "90.24"})