动态枢轴网格使用MVC, AngularJS和WEB API 2
介绍 在本文中,我们将详细介绍如何使用AngularJS创建一个简单的MVC Pivot HTML网格。在我之前的文章中,我已经解释了如何创建一个动态的项目计划。在那篇文章中,我使用存储过程来显示来自SQL查询的枢轴结果。 在实时项目中,我们需要生成多种类型的报告,并且需要按行显示要按列显示的数据。在这篇文章中,我将解释如何使用AngularJS创建一个透视网格来显示前端的实际数据。 例如,让我们考虑下面的例子。我有玩具类型(类别)和玩具名称与销售价格每天。 在我们的数据库中,我们插入带有价格详细信息的玩具详细信息的每条记录。插入数据库的原始数据是这样的。 玩具销售明细表 这里我们可以看到总共有11条记录。每个约会都有重复的玩具名称和玩具类型。现在,如果我想查看玩具类型的每个玩具名称的总销售额,那么我需要创建一个pivot结果来显示每个玩具类型的每个玩具名称的总和的记录。所需的输出如下所示, 以玩具名称与价格总和为轴心 在这里,我们可以看到查看每个玩具名称的总销售额要容易得多。在主元中,我们还可以添加列和行总和。把总数加起来,就可以很容易地发现哪一件商品的销售额最高。 统计结果有很多种,我们每年每月可以看到一个玩具销售的统计报告。我们在此显示由七月七日至十一月十一日每月的数据透视结果。 按月计算价格 在本文中,我们将看到两种类型的轴心报告。 Pivot结果显示按玩具名称为每种玩具类型的价格总和。Pivot结果显示每个玩具名称按月的价格总和。 先决条件 Visual Studio 2015 -你可以从这里下载。 您还可以查看我以前的文章,这些文章是关于使用MVC和WCF Rest服务的AngularJS。 MVC AngularJs剩下WCF服务读者测验MVC, AngularJs剩下WCF服务明细网格AngularJs过滤、排序和动画使用MVC和WCF Rest AngularJs购物车使用MVC和WCF Rest服务AngularJs动态菜单创建使用MVC和WCF休息以前文章相关角JS, MVC和WEB API: 图像预览使用MVC, AngularJs和Web API 2 MVC,使用WEB API与存储过程2角JS CRUD http://www.codeproject.com/articles/1015183/dynamic-project-scheduling-using-mvc-and-angularjs http://www.codeproject.com/articles/1019587/mvc-web-api-and-angularjs-for-image-puzzle-game http://www.codeproject.com/articles/1030954/mvc-web-api-and-angularjs-for-are-you-genius-game http://www.codeproject.com/articles/1046214/mvc-angularjs-master-detail-crud-filter-and-sortin?msg=5168459 # xx5168459xx 使用的代码 创建数据库和表 在第一步中,我们将创建一个示例数据库和表,用于我们的项目,下面是创建数据库、表和示例插入查询的脚本。 在SQL服务器中运行以下脚本。我用过SQL Server 2014. 隐藏,收缩,复制Code
-- Author : Shanu
-- Create date : 2015-11-20
-- Description : To Create Database,Table and Sample Insert Query
-- Latest
-- Modifier : Shanu
-- Modify date : 2015-11-20
-- =============================================
--Script to create DB,Table and sample Insert data
USE MASTER;
-- 1) Check for the Database Exists .If the database is exist then drop and create new DB
IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'ToysDB' )
BEGIN
ALTER DATABASE ToysDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE ToysDB ;
END CREATE DATABASE ToysDB
GO USE ToysDB
GO -- 1) //////////// ToysDetails table -- Create Table ToysDetails ,This table will be used to store the details like Toys Information IF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'ToysSalesDetails' )
DROP TABLE ToysSalesDetails
GO CREATE TABLE ToysSalesDetails
(
Toy_ID int identity(1,1),
Toy_Type VARCHAR(100) NOT NULL,
Toy_Name VARCHAR(100) NOT NULL,
Toy_Price int NOT NULL,
Image_Name VARCHAR(100) NOT NULL,
SalesDate DateTime NOT NULL,
AddedBy VARCHAR(100) NOT NULL,
CONSTRAINT [PK_ToysSalesDetails] PRIMARY KEY CLUSTERED
(
[Toy_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO --delete from ToysSalesDetails
-- Insert the sample records to the ToysDetails Table
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Spiderman',1650,'ASpiderman.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Spiderman',1250,'ASpiderman.png',getdate()-6,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Superman',1450,'ASuperman.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Superman',850,'ASuperman.png',getdate()-4,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Thor',1350,'AThor.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Thor',950,'AThor.png',getdate()-8,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Wolverine',1250,'AWolverine.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Wolverine',450,'AWolverine.png',getdate()-3,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','CaptainAmerica',1100,'ACaptainAmerica.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Spiderman',250,'ASpiderman.png',getdate()-120,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Spiderman',1950,'ASpiderman.png',getdate()-40,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Superman',1750,'ASuperman.png',getdate()-40,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Thor',900,'AThor.png',getdate()-100,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Thor',850,'AThor.png',getdate()-50,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Wolverine',250,'AWolverine.png',getdate()-80,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','CaptainAmerica',800,'ACaptainAmerica.png',getdate()-60,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Superman',1950,'ASuperman.png',getdate()-80,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Thor',1250,'AThor.png',getdate()-30,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Action','Wolverine',850,'AWolverine.png',getdate()-20,'Shanu') Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Lion',1250,'Lion.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Lion',950,'Lion.png',getdate()-4,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Tiger',1900,'Tiger.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Tiger',600,'Tiger.png',getdate()-2,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Panda',650,'Panda.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Panda',1450,'Panda.png',getdate()-1,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Dog',200,'Dog.png',getdate(),'Shanu') Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Lion',450,'Lion.png',getdate()-20,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Tiger',400,'Tiger.png',getdate()-90,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Panda',550,'Panda.png',getdate()-120,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Dog',1200,'Dog.png',getdate()-60,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Lion',450,'Lion.png',getdate()-90,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Animal','Tiger',400,'Tiger.png',getdate()-30,'Shanu') Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Bird','Owl',600,'BOwl.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Bird','Greenbird',180,'BGreenbird.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Bird','Thunderbird',550,'BThunderbird-v2.png',getdate(),'Shanu') Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Bird','Owl',600,'BOwl.png',getdate()-50,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Bird','Greenbird',180,'BGreenbird.png',getdate()-90,'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Bird','Thunderbird',550,'BThunderbird-v2.png',getdate()-120,'Shanu') Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Car','SingleSeater',1600,'CSingleSeater.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Car','Mercedes',2400,'CMercedes.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Car','FordGT',1550,'CFordGT.png',getdate(),'Shanu')
Insert into ToysSalesDetails(Toy_Type,Toy_Name,Toy_Price,Image_Name,SalesDate,AddedBy) values('Car','Bus',700,'CBus.png',getdate(),'Shanu') select *,
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (DATENAME(month, SalesDate) * 4) - 3, 3) as 'Month'
from ToysSalesDetails
Where YEAR(SalesDate)=YEAR(getdate())
Order by Toy_Type,Toy_Name,Image_Name,SalesDate -- 1) END //
在创建表之后,我们将创建一个存储过程来从数据库中获取所有数据,以便使用AngularJS和Web API从MVC应用程序中创建Pivot网格。 1. 创建存储过程的脚本 隐藏,收缩,复制Code
-- 1) Stored procedure to Select ToysSalesDetails
-- Author : Shanu
-- Create date : 2015-11-20
-- Description : Toy Sales Details
-- Tables used : ToysSalesDetails
-- Modifier : Shanu
-- Modify date : 2015-11-20
-- =============================================
-- exec USP_ToySales_Select '',''
-- =============================================
CREATE PROCEDURE [dbo].[USP_ToySales_Select]
(
@Toy_Type VARCHAR(100) = '',
@Toy_Name VARCHAR(100) = ''
)
AS
BEGIN
select Toy_Type as ToyType
,Toy_Name as ToyName
,Image_Name as ImageName
,Toy_Price as Price
,AddedBy as 'User'
,DATENAME(month, SalesDate) as 'Month' FROM ToysSalesDetails
Where
Toy_Type like @Toy_Type +'%'
AND Toy_Name like @Toy_Name +'%'
AND YEAR(SalesDate)=YEAR(getdate())
ORDER BY
Toy_Type,Toy_Name,SalesDate END
2. 在Visual Studio 2015中创建您的MVC Web应用程序。 在安装Visual Studio 2015之后,单击“开始”,然后单击“程序”,并选择Visual Studio 2015。单击Visual Studio 2015,然后单击New, Project,选择Web,然后单击ASP。净的Web应用程序。选择项目位置并输入web应用程序名称。 选择MVC,并在Add Folders和Core reference中选择Web API,然后单击OK。 使用ADO添加数据库。NET实体数据模型 右键单击我们的项目,然后单击Add,然后单击New Item。 Select 数据,then , ADO。NET实体数据模型,并为我们的EF和click Add命名。 从数据库中选择EF Designer并单击Next。 在这里单击新建连接并提供您的SQL Server - Server名称并连接到您的数据库。 在这里我们可以看到,我已经给出了我的SQL服务器名称、Id和PWD,在它连接上之后,我选择了ToysDB作为数据库,因为我们已经使用SQL脚本创建了数据库。 单击next并选择需要使用的表和所有存储过程,然后单击finish。 现在我们可以看到,我们已经创建了我们的玩具销售模型。 实体创建完成后,下一步是向控制器添加Web API,并编写用于选择/插入/更新和删除的函数。 添加Web API控制器的过程 右键单击Controllers文件夹,单击Add,然后单击Controller。 选择Controller并添加一个空的Web API 2控制器。向Web API控制器提供您的名称并单击OK。在这里我给我的Web API控制器命名为“ToyController”。在这个演示项目中,我已经为订单主和订单细节创建了2个不同的控制器。 当我们创建了Web API控制器时,我们可以看到我们的控制器被ApiController继承了。 我们都知道,Web API是为浏览器和移动设备构建HTTP服务的一种简单而容易的方法。 Web API有以下四种方法:Get/Post/Put和delete&put: 是请求数据。(选择)post 是创建一个数据。(插入)put 是更新数据。删除就是删除数据。 Get方法 在我们的示例中,我只使用了一个Get方法,因为我只使用一个存储过程来获取数据并使用AngularJS绑定到我们的MVC页面。 选择操作 我们使用一个get方法来使用一个实体对象来获得ToysSalesDetails 表的所有细节,并将结果返回为IEnumerable。我们在AngularJS中使用这个方法,并将结果显示在来自AngularJS控制器的MVC页面中。使用Ng-Repeat,我们可以绑定细节。 这里我们可以看到,在get方法中,我已经将搜索参数传递给了USP_ToySales_SelectStored过程。在存储过程中,如果搜索参数为空,我使用“%”来返回所有记录。 隐藏,复制Code
public class ToyController: ApiController
{
ToysDBEntities objAPI = new ToysDBEntities();
// to Search Student Details and display the result
[HttpGet]
public IEnumerable < USP_ToySales_Select_Result > Get(string ToyType, string ToyName)
{
if(ToyType == null) ToyType = "";
if(ToyName == null) ToyName = "";
return objAPI.USP_ToySales_Select(ToyType, ToyName)
.AsEnumerable();
}
}
现在我们已经创建了Web API控制器类。下一步是创建我们的AngularJS模块和控制器。让我们看看如何创建我们的AngularJS控制器。在Visual Studio 2015中,添加我们的AngularJS控制器要容易得多。让我们一步一步地看看如何创建和编写我们的AngularJS控制器。 创建AngularJs控制器 首先,在script文件夹中创建一个文件夹,我将这个文件夹命名为“MyAngular”。 现在将你的Angular控制器添加到这个文件夹中。 右键单击MyAngular文件夹,然后单击Add和New Item。选择Web,然后选择AngularJS控制器,并为控制器提供一个名称。我把我的AngularJS控制器命名为“Controller.js”。 一旦创建了AngularJS控制器,我们可以看到在默认情况下,控制器将拥有带有默认模块定义的代码和所有。 我已经更改了前面的代码,如添加模块和控制器,如下所示。 如果缺少AngularJS包,则将该包添加到您的项目中。 右键单击您的MVC项目并单击管理NuGet包。搜索AngularJS并点击安装。 现在我们可以看到所有AngularJs包都已经安装好了,我们可以看到Script文件夹中的所有文件。 创建AngularJs脚本文件的程序 js:在这里,我们将添加到AngularJS JavaScript的引用,并创建一个名为“OrderModule”的Angular模块。 隐藏,复制Code
// <reference path="../angular.js" />
/// <reference path="../angular.min.js" />
/// <reference path="../angular-animate.js" />
/// <reference path="../angular-animate.min.js" />
var app; (function () {
app = angular.module("OrderModule", ['ngAnimate']);
})();
控制器:在AngularJS控制器中,我已经完成了所有的业务逻辑并将数据从Web API返回到我们的MVC HTML页面。 1. 变量声明 首先,我声明了所有需要使用的局部变量。 隐藏,复制Code
app.controller("AngularJsOrderController", function ($scope,$sce, $timeout, $rootScope, $window, $http) {
$scope.date = new Date();
$scope.MyName = "shanu"; //For Order Master Search
$scope.ToyType = "";
$scope.ToyName = ""; // 1) Item List Arrays.This arrays will be used to display .
$scope.itemType = [];
$scope.ColNames = []; // 2) Item List Arrays.This arrays will be used to display .
$scope.items = [];
$scope.ColMonths = [];
2. 方法 选择方法 在select方法中,我使用了$http.get 来从Web API获取详细信息。在get方法中,我将提供API控制器名称和方法来获取细节。这里我们可以看到我已经传递了搜索参数OrderNO和TableID使用: 隐藏,复制Code
{ params: { ToyType: ToyType, ToyName: ToyName }
该函数将在每次加载页面时调用。在页面加载期间,我将获得所有的细节,并创建我们的Pivot结果首先,我将在数组中存储每个唯一的玩具名称,以显示Pivot报告按玩具名称作为列和月号,在数组中显示的Pivot报告按月总和。 在存储了玩具名称和月份的唯一值之后,我将调用$scope.getMonthDetails();scope.getToyNameDetails美元();生成Pivot报告并绑定结果。 隐藏,收缩,复制Code
// To get all details from Database
selectToySalesDetails($scope.ToyType, $scope.ToyName);
// To get all details from Database
function selectToySalesDetails(ToyType, ToyName)
{
$http.get('/api/Toy/',
{
params:
{
ToyType: ToyType,
ToyName: ToyName
}
})
.success(function (data)
{
$scope.ToyDetails = data;
if($scope.ToyDetails.length > 0)
{
//alert($scope.ToyDetails.length);
var uniqueMonth = {},
uniqueToyName = {},
i;
for(i = 0; i < $scope.ToyDetails.length; i += 1)
{
// For Column wise Month add
uniqueMonth[$scope.ToyDetails[i].Month] = $scope.ToyDetails[i];
//For column wise Toy Name add
uniqueToyName[$scope.ToyDetails[i].ToyName] = $scope.ToyDetails[i];
}
// For Column wise Month add
for(i in uniqueMonth)
{
$scope.ColMonths.push(uniqueMonth[i]);
}
// For Column wise ToyName add
for(i in uniqueToyName)
{
$scope.ColNames.push(uniqueToyName[i]);
}
// To disply the Month wise Pivot result
$scope.getMonthDetails();
// To disply the Month wise Pivot result
$scope.getToyNameDetails();
}
})
.error(function ()
{
$scope.error = "An Error has occured while loading posts!";
});
}
首先,我将绑定来自数据库的所有实际数据。在这里我们可以看到所有的数据从数据库已经显示了总计近43条记录。我们将根据这些实际数据创建一个动态Pivot报告。 Pivot结果显示按玩具名称为每种玩具类型的价格总和 在这个透视报告中,我将以行显示玩具类型,以列显示玩具名称。在我们的表单加载方法中,我们已经将所有唯一的玩具名称存储在数组中,它将被绑定为列。现在,在这个方法中,我将添加唯一的玩具类型,并显示为行。 隐藏,复制Code
// To Display Toy Details as Toy Name Pivot Cols
$scope.getToyNameDetails = function () { var UniqueItemName = {}, i for (i = 0; i < $scope.ToyDetails.length; i += 1) { UniqueItemName[$scope.ToyDetails[i].ToyType] = $scope.ToyDetails[i];
}
for (i in UniqueItemName) { var ItmDetails = {
ToyType: UniqueItemName[i].ToyType
};
$scope.itemType.push(ItmDetails);
}
}
在这里我们可以看到,现在我已经添加了所有唯一的ToyType图标数组,它将绑定到我们的MVC页面。 在HTML表格创建中,我们可以看到,首先我将创建网格标题。在网格标题中,我动态地使用data-ng-repeat="Cols In Cols Cols在ColNames | orderBy:'ToyName':false"将玩具类型和所有其他玩具名称显示为列。 HTML部分:, 隐藏,复制Code
<trstyle="height: 30px; background-color:#336699 ; color:#FFFFFF ;border: solid 1px #659EC7;">
<tdwidth="20"></td>
<tdwidth="200"align="center"><b>ToyType</b></td>
<tdalign="center"data-ng-repeat="Cols in ColNames | orderBy:'ToyName':false"style="border: solid 1px #FFFFFF; ">
<table>
<tr>
<tdwidth="80"><b>{{Cols.ToyName}}</b></td>
</tr>
</table>
</td>
<tdwidth="60"align="center"><b>Total</b></td>
</tr>
在绑定列之后,我将把所有的玩具类型绑定为行,对于每个类型类型和玩具名称,我将显示价格的摘要每一个适当的列。 HTML的一部分 隐藏,复制Code
<tbodydata-ng-repeat="itm in itemType">
<tr>
<tdwidth="20">{{$index+1}}</td>
<tdalign="left"style="border: solid 1px #659EC7; padding: 5px;"> <spanstyle="color:#9F000F">{{itm.ToyType}}</span> </td>
<tdalign="center"data-ng-repeat="ColsNew in ColNames | orderBy:'ToyName':false"align="right"style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
<table>
<tr>
<tdalign="right"> <spanng-bind-html="showToyItemDetails(itm.ToyType,ColsNew.ToyName)"></span> </td>
</tr>
</table>
</td>
<tdalign="right"> <spanng-bind-html="showToyColumnGrandTotal(itm.ToyType,ColsNew.ToyName)"></span> </td>
</tr>
</tbody>
AngularJS部分 在MVC页面中,我将调用这个方法在计算。 之后将结果汇总价格绑定到每一行中。 隐藏,复制Code
// To Display Toy Details as Toy Name wise Pivot Price Sum calculate
$scope.showToyItemDetails = function (colToyType, colToyName)
{
$scope.getItemPrices = 0;
for(i = 0; i < $scope.ToyDetails.length; i++)
{
if(colToyType == $scope.ToyDetails[i].ToyType)
{
if(colToyName == $scope.ToyDetails[i].ToyName)
{
$scope.getItemPrices = parseInt($scope.getItemPrices) + parseInt($scope.ToyDetails[i].Price);
}
}
}
if(parseInt($scope.getItemPrices) > 0)
{
return $sce.trustAsHtml("<font color='red'><b>" + $scope.getItemPrices.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</b></font>");
}
else
{
return $sce.trustAsHtml("<b>" + $scope.getItemPrices.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</b>");
}
}
列总 在每一行末尾显示列总数。在这个方法中,我将计算每一行结果,并返回值绑定到MVC page. 隐藏,复制Code
// To Display Toy Details as Toy Name wise Pivot Column wise Total
$scope.showToyColumnGrandTotal = function (colToyType, colToyName) { $scope.getColumTots = 0; for (i = 0; i < $scope.ToyDetails.length; i++) {
if (colToyType == $scope.ToyDetails[i].ToyType) {
$scope.getColumTots = parseInt($scope.getColumTots) + parseInt($scope.ToyDetails[i].Price);
}
}
return $sce.trustAsHtml("<font color='#203e5a'><b>" + $scope.getColumTots.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</b></font>");
}
行总: 在每个列的末尾显示行总数。在这个方法中,我将计算每个列的结果,并返回值绑定到MVC页。 隐藏,复制Code
// To Display Toy Details as Month wise Pivot Row wise Total
$scope.showToyRowTotal = function (colToyType, colToyName)
{
$scope.getrowTotals = 0;
for(i = 0; i < $scope.ToyDetails.length; i++)
{
if(colToyName == $scope.ToyDetails[i].ToyName)
{
$scope.getrowTotals = parseInt($scope.getrowTotals) + parseInt($scope.ToyDetails[i].Price);
}
}
return $sce.trustAsHtml("<font color='#203e5a'><b>" + $scope.getrowTotals.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</b></font>");
}
行和列合计:计算行和列合计 隐藏,复制Code
// To Display Toy Details as Month wise Pivot Row & Column Grand Total
$scope.showToyGrandTotals = function (colToyType, colToyName)
{
$scope.getGrandTotals = 0;
if($scope.ToyDetails && $scope.ToyDetails.length)
{
for(i = 0; i < $scope.ToyDetails.length; i++)
{
$scope.getGrandTotals = parseInt($scope.getGrandTotals) + parseInt($scope.ToyDetails[i].Price);
}
}
return $sce.trustAsHtml("<b>" + $scope.getGrandTotals.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "</b>");
}
Pivot结果显示每个玩具名称按月的价格总和 与上面相同的逻辑用于计算和绑定每月玩具名称汇总细节的Pivot报告。在这里,我们可以看到它看起来是这样的,在行中,我将绑定玩具类型(玩具类别)玩具名称,玩具图像为静态,并在列中动态地绑定所有月份的数字。和上面的功能一样,我将计算所有的玩具汇总价格每月和显示在每一行与行合计,列合计和总计。 点击搜索按钮 在搜索按钮单击,我将调用SearchMethod来绑定结果。在搜索方法中,我将清除所有的数组值,并重新绑定所有的主元网格和新的结果。 隐藏,复制Code
<inputtype="text"name="txtToyType"ng-model="ToyType"value=""/>
<inputtype="text"name="txtToyName"ng-model="ToyName"/>
<inputtype="submit"value="Search"style="background-color:#336699;color:#FFFFFF"ng-click="searchToySales()"/>
//Search
$scope.searchToySales = function () {
// 1) Item List Arrays.This arrays will be used to display .
$scope.itemType = [];
$scope.ColNames = []; // 2) Item List Arrays.This arrays will be used to display .
$scope.items = [];
$scope.ColMonths = []; selectToySalesDetails($scope.ToyType, $scope.ToyName);
}
的兴趣点 注意:下载代码并运行所有SQL脚本文件。在WebConfig中,用SQL服务器连接更改连接字符串。 历史 shanuAngularMVCPivotGridS.zip - 2015-12-02 本文转载于:http://www.diyabc.com/frontweb/news19110.html
动态枢轴网格使用MVC, AngularJS和WEB API 2的更多相关文章
- ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?
ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...
- 如何将一个 ASP.NET MVC 4 和 Web API 项目升级到 ASP.NET MVC 5 和 Web API 2
----转自微软官网www.asp.net/mvc/ ASP.NET MVC 5 和 Web API 2 带来的新功能,包括属性路由. 身份验证筛选器,以及更多的主机.请参阅http://www.as ...
- 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】
Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...
- ASP.NET Core MVC中构建Web API
在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...
- MVC中使用Web API和EntityFramework
在ASP.NET MVC中使用Web API和EntityFramework构建应用程序 最近做了一个项目技术预研:在ASP.NET MVC框架中使用Web API和EntityFramework ...
- 使用MVC 5、Web API 2、KnockoutJS、Ninject和NUnit开发、架构和测试Web应用程序
做一名微软软件开发人员就像在国际煎饼屋订早餐一样.每道菜都有一堆煎饼,你必须从各种各样的煎饼和糖浆口味中选择.对于web应用程序,解决方案堆栈是一组软件子系统或组件,用于交付功能完整的解决方案(无论是 ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- 在ASP.NET MVC中使用Web API和EntityFramework构建应用程序
最近做了一个项目技术预研:在ASP.NET MVC框架中使用Web API和EntityFramework,构建一个基础的架构,并在此基础上实现基本的CRUD应用. 以下是详细的步骤. 第一步 在数据 ...
- angularjs呼叫Web API
今早有分享一篇<创建Web API并使用>http://www.cnblogs.com/insus/p/7771428.html 接下来,我再分享一篇,怎样在angularjs去呼叫Web ...
随机推荐
- 深入了解Netty【八】TCP拆包、粘包和解决方案
1.TCP协议传输过程 TCP协议是面向流的协议,是流式的,没有业务上的分段,只会根据当前套接字缓冲区的情况进行拆包或者粘包: 发送端的字节流都会先传入缓冲区,再通过网络传入到接收端的缓冲区中,最终由 ...
- 非IT行业大企程序员讲述MIS系统开发案例
雪莉叹了一口气,调整了一下被汗水濡湿的刘海,然后向后靠在办公椅中,伸手在电脑键盘上输入了一些内容, 最后拿起印刷着房地产广告的扇子,边扇风边等待着. 她的工位在办公室的东侧角落,侧靠着窗.此时 ...
- apply用法
result.push.apply(result, document.getElementsByTagName(tag)); 但是,这里为什么要用apply呢? 因为document.getEleme ...
- Vue 事件的高级使用方法
Vue 事件的高级使用方法 事件方法 在Vue中提供了4中事件监听方法,分别是: $on(event: string | Array, fn) $emit(event: string) $once(e ...
- Ubuntu修改默认Python版本,你了解多少~
目录 1 查看Python版本 1.1 查看装有哪些版本 1.2 查看默认版本 2 修改Python默认版本 2.1 基于文件修改 2.2 基于软链接修改 1 查看Python版本 1.1 查看装有哪 ...
- 从头看看Tomcat启动Spring容器的原理
通过带注解Spring Boot可以启动一个web容器,并初始化bean容器.那么Tomcat启动并初始化spring容器的原理是怎样的? Tomcat启动web程序时会创建一对父子容器(图1): 有 ...
- 第15课 - make的隐式规则(上)
第15课 - make的隐式规则(上) 1. 问题 如果把同一个目标的命令拆分的写到不同地方,会发生什么? 执行make all 这个实验表明了:如果同一个目标的命令拆分的写到不同地方,那么 make ...
- Mybatis和Mybatis-Plus时间范围查询,亲测有效
一.mysql 1.传入时间范围参数类型是字符串 <if test="startTime!=null and startTime.trim() neq ''"> and ...
- 软件工程与UML作业2
博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE ...
- StringBuilder 比 String 快?空嘴白牙的,证据呢!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 聊的是八股的文,干的是搬砖的活! 面我的题开发都用不到,你为什么要问?可能这是大部分 ...