您的位置:首页 > 编程语言 > ASP

七天学会ASP.NET MVC(七)——创建单页应用

2015-08-11 12:08 701 查看



系列文章

七天学会ASP.NETMVC(一)——深入理解ASP.NETMVC

七天学会ASP.NETMVC(二)——ASP.NETMVC数据传递

七天学会ASP.NETMVC(三)——ASP.NetMVC数据处理

七天学会ASP.NETMVC(四)——用户授权认证问题

[b]七天学会ASP.NETMVC(五)——Layout页面使用和用户角色管理[/b]

七天学会ASP.NETMVC(六)——线程问题、异常处理、自定义URL

[b]七天学会ASP.NETMVC(七)——创建单页应用[/b]

目录

引言

最后一篇学什么

实验32—整理项目组织结构

关于实验32

实验33——创建单页应用——第一部分—安装

什么是Areas?

关于实验33

实验34——创建单页应用——第二部分—显示Employee

实验35——创建单页应用——第三部分—新建Employee

实验36——创建单页应用——第三部分—上传

实验32———整理项目组织结构

实验32与其他实验不同,本实验并不是在之前实验基础之上为程序添加新的功能,实验32主要目的是整理项目结构,使项目条理清晰,能够结构化系统化,便于其他人员理解。

1.创建解决方案文件夹

右键单击,选择“新解决方案文件夹—>添加—>新解决方案”,命名为“ViewAndController”



重复上述步骤,创建文件夹“Model”,“ViewModel”,”DataAccessLayer”



2.创建数据访问层工程

右击“DataAccessLayer”文件夹,新建类库“DataAccessLayer”。

3.创建业务层和业务实体项

在Model文件夹下创建新类库“BusinessLayer”和“BusinessEntities”

4.创建ViewModel项

在ViewModel文件夹下新建类库项“ViewModel“

5.添加引用

为以上创建的项目添加引用,如下:

1.DataAccessLayer添加BusinessEntities项

2.BusinessLayer添加DataAccessLayer和BusinessEntities项

3.MVCWebApplication选择BusinessLayer,BusinessEntities,ViewModel

4.BusinessEntities添加System.ComponentModel.DataAnnotations

6.设置

1.将DataAccessLayer文件夹下的SalesERPDAL.cs文件,复制粘贴到新创建的DataAccessLayer类库中。



2.删除MVC项目(WebApplication1)的DataAccessLayer文件夹
3.同上,将Model文件夹中的Employee.cs,UserDetails.cs及UserStatus.cs文件复制到新建的BusinessEntities文件夹中。

4.将MVC项目中的Model文件夹的EmployeeBusinessLayer.cs文件粘贴到新建的BusinessLayer的文件夹中。

5.删除MVC中的Model文件夹

6.将MVC项目的ViewModels文件夹下所有的文件复制到新建的ViewModel类库项中。

7.删除ViewModels文件夹

8.将整个MVC项目剪切到”ViewAndController”解决方案文件夹中。

7.Build

选择Build->BuildSolutionfrommenubar,会报错。



8.改错

1.给ViewModel项添加System.Web引用

2.在DataAccessLayer和BusinessLayer中使用Nuget管理,并安装EF(EntityFramework)(如果对于Nuget的使用有不理解的地方可以查看第三篇博客文章)

注意:在BusinessLayer中引用EF是非常必要的,因为BusinessLayer与DataAccessLayer直接关联的,而完善的体系架构它自身的业务层是不应该与DataAccessLayer直接关联,因此我们必须使用pattern库,协助完成。

3.删除MVC项目中的EF

右击MVC项目,选择”ManageNugetpackages“选项

在弹出的对话框中选择”InstalledPackages“

则会显示所有的已安装项,选择EF,点解卸载。

9.编译会发现还是会报错



10.修改错误

报错是由于在项目中既没有引用SalesERPDAL,也没有引用EF,在项目中直接引用也并不是优质的解决方案。

1.在DataAccessLayer项中新建带有静态方法”SetDatabase“的类”DatabaseSettings“

usingSystem.Data.Entity;

[code]usingWebApplication1.DataAccessLayer;
namespaceDataAccessLayer
{

publicclassDatabaseSettings
{

publicstaticvoidSetDatabase()
{

Database.SetInitializer(newDropCreateDatabaseIfModelChanges<SalesERPDAL>());<saleserpdal>

}

}

}


[/code]

2.在BusinessLayer项中新建带有”SetBusiness“静态方法的”BusinessSettings“类。


usingDataAccessLayer;

[code]
namespaceBusinessLayer
{

publicclassBusinessSettings
{

publicstaticvoidSetBusiness()
{

DatabaseSettings.SetDatabase();

}

}

}

[/code]

3.删除global.asax中的报错的Using语句和Database.SetInitializer语句。调用BusinessSettings.SetBusiness函数:


usingBusinessLayer;

[code].
.

.

BundleConfig.RegisterBundles(BundleTable.Bundles);

BusinessSettings.SetBusiness();

[/code]

再次编译程序,会发现成功。

关于实验32

什么是解决方案文件夹?

解决方案文件夹是逻辑性的文件夹,并不是在物理磁盘上实际创建,这里使用解决方案文件夹就是为了使项目更系统化更有结构。

实验33——创建单页应用1—安装

实验33中,不再使用已创建好的控制器和视图,会创建新的控制器及视图,创建新控制器和视图原因如下:

1.保证现有的选项完整,也会用于旧版本与新版本对比
2.学习理解ASP.NETMVC新概念:Areas

接下来,我们需要从头开始新建controllers,views,ViewModels。

下面的文件可以被重用:

已创建的业务层

已创建的数据访问层

已创建的业务实体

授权和异常过滤器

FooterViewModel

Footer.cshtml

1.创建新Area

右击项目,选择添加->Area,在弹出对话框中输入SPA,点击确认,生成新的文件夹,因为在该文件夹中不需要Model中Area的文件夹,删掉。





接下来我们先了解一下Areas的概念

Areas

Areas是实现Asp.netMVC项目模块化管理的一种简单方法。

每个项目由多个模块组成,如支付模块,客户关系模块等。在传统的项目中,采用“文件夹”来实现模块化管理的,你会发现在单个项目中会有多个同级文件夹,每个文件夹代表一个模块,并保存各模块相关的文件。

然而,在Asp.netMVC项目中使用自定义文件夹实现功能模块化会导致很多问题。

下面是在Asp.NetMVC中使用文件夹来实现模块化功能需要注意的几点:

DataAccessLayer,BusinessLayer,BusinessEntities和ViewModels的使用不会导致其他问题,在任何情况下,可视作简单的类使用。

Controllers—只能保存在Controller文件夹,但是这不是大问题,从MVC4开始,控制器的路径不再受限。现在可以放在任何文件目录下。

所有的Views必须放在“~/Views/ControllerName”or“~/Views/Shared”文件夹。

2.创建必要的ViewModels

在ViewModel类库下新建文件夹并命名为SPA,创建ViewModel,命名为”MainViewModel“,如下:


usingWebApplication1.ViewModels;

[code]namespaceWebApplication1.ViewModels.SPA
{

publicclassMainViewModel
{

publicstringUserName{get;set;}

publicFooterViewModelFooterData{get;set;}//NewProperty

}

}

[/code]

3.创建Indexaction方法

在MainController中输入:


usingWebApplication1.ViewModels.SPA;

[code]usingOldViewModel=WebApplication1.ViewModels;
[/code]

在MainController中新建Action方法,如下:


publicActionResultIndex()

[code]{
MainViewModelv=newMainViewModel();

v.UserName=User.Identity.Name;

v.FooterData=newOldViewModel.FooterViewModel();

v.FooterData.CompanyName="StepByStepSchools";//Canbesettodynamicvalue

v.FooterData.Year=DateTime.Now.Year.ToString();

returnView("Index",v);

}

[/code]

usingOldViewModel=WebApplication1.ViewModels这行代码中,给WebApplication1.ViewModels添加了别名OldViewModel,使用时可直接写成OldViewModel.ClassName这种形式。

如果不定义别名的话,会产生歧义,因为WebApplication1.ViewModels.SPA和WebApplication1.ViewModels下有名称相同的类。

4.创建IndexView

创建与上述Index方法匹配的View


@usingWebApplication1.ViewModels.SPA

[code]@modelMainViewModel
<!DOCTYPEhtml>


<html>
<head>

<metaname="viewport"content="width=device-width"/>

<title>EmployeeSinglePageApplication</title>

[/code]

5.运行测试



关于实验33

为什么在控制器名前需要使用SPA关键字?

在ASP.NETMVC应用中添加area时,VisualStudio会自动创建并命名为“[AreaName]AreaRegistration.cs”的文件,其中包含了AreaRegistration的派生类。该类定义了AreaName属性和用来定义register路劲信息的RegisterArea方法。

在本次实验中你会发现nameSpaArealRegistration.cs文件被存放在“~/Areas/Spa”文件夹下,SpaArealRegistration类的RegisterArea方法的代码如下:

context.MapRoute(

[code]"SPA_default",
"SPA/{controller}/{action}/{id}",

new{action="Index",id=UrlParameter.Optional}

);

[/code]


这就是为什么一提到Controllers,我们会在Controllers前面加SPA关键字。


SPAAreaRegistrationRegisterArea方法是怎样被调用的?

打开global.asax文件,首行代码如下:

AreaRegistration.RegisterAllAreas();



RegisterAllAreas方法会找到应用程序域中所有AreaRegistration的派生类,并主动调用RegisterArea方法

是否可以不使用SPA关键字来调用MainController?

AreaRegistration类在不删除其他路径的同时会创建新路径。RouteConfig类中定义了新路径仍然会起作用。如之前所说的,Controller存放的路径是不受限制的,因此它可以工作但可能不会正常的显示,因为无法找到合适的View。

实验34——创建单页应用2—显示Employees

1.创建ViewModel,实现“显示Empoyee”功能

在SPA中新建两个ViewModel类,命名为”EmployeeViewModel“及”EmployeeListViewModel“:


namespaceWebApplication1.ViewModels.SPA

[code]{
publicclassEmployeeViewModel
{

publicstringEmployeeName{get;set;}

publicstringSalary{get;set;}

publicstringSalaryColor{get;set;}

}

}

[/code]



namespaceWebApplication1.ViewModels.SPA
{

[code]publicclassEmployeeListViewModel
{

publicList<employeeviewmodel>Employees{get;set;}

}

}

</employeeviewmodel>

[/code]

注意:这两个ViewModel都是由非SPA应用创建的,唯一的区别就在于这次不需要使用BaseViewModel。

2.创建EmployeeListIndex

在MainController中创建新的Action方法”EmployeeList“action方法


publicActionResultEmployeeList()

[code]{
EmployeeListViewModelemployeeListViewModel=newEmployeeListViewModel();

EmployeeBusinessLayerempBal=newEmployeeBusinessLayer();

List<employee>employees=empBal.GetEmployees();


List<employeeviewmodel>empViewModels=newList<employeeviewmodel>();


foreach(Employeeempinemployees)
{

EmployeeViewModelempViewModel=newEmployeeViewModel();

empViewModel.EmployeeName=emp.FirstName+""+emp.LastName;

empViewModel.Salary=emp.Salary.Value.ToString("C");

if(emp.Salary>15000)
{

empViewModel.SalaryColor="yellow";

}

else
{

empViewModel.SalaryColor="green";

}

empViewModels.Add(empViewModel);

}

employeeListViewModel.Employees=empViewModels;

returnView("EmployeeList",employeeListViewModel);

}

</employeeviewmodel>

[/code]

注意:不需要使用HeaderFooterFilter

3.创建AddNewLink分部View

之前添加AddNewLink分部View已经无法使用,因为Anchor标签会造成全局刷新,我们的目标是创建”单页应用“,因此不需要全局刷新。

在”~/Areas/Spa/Views/Main“文件夹新建分部View”AddNewLink.cshtml“。


<ahref="#"onclick="OpenAddNew();">AddNew</a>



4.创建AddNewLinkAction方法

在MainController中创建”GetAddNewLink“action方法。


publicActionResultGetAddNewLink()

[code]{
if(Convert.ToBoolean(Session["IsAdmin"]))
{

returnPartialView("AddNewLink");

}

else
{

returnnewEmptyResult();

}

}

[/code]

5.新建EmployeeListView

在“~/Areas/Spa/Views/Main”中创建新分部View命名为“EmployeeList”。


@usingWebApplication1.ViewModels.SPA

[code]@modelEmployeeListViewModel
<div>

@{

Html.RenderAction("GetAddNewLink");

}


<tableborder="1"id="EmployeeTable">

<tr>

<th>EmployeeName</th>

[/code]

6.设置EmployeeList为初始页面

打开“~/Areas/Spa/Views/Main/Index.cshtml”文件,在Div标签内包含EmployeeListaction结果。

...

[code]</div>
[/code]

7.运行



实验35——创建单页应用3—创建Employee

1.创建AddNewViewModels

在SPA中新建ViewModel类库项的ViewModel,命名为“CreateEmployeeViewModel”。


namespaceWebApplication1.ViewModels.SPA

[code]{
publicclassCreateEmployeeViewModel
{

publicstringFirstName{get;set;}

publicstringLastName{get;set;}

publicstringSalary{get;set;}

}

}

[/code]

2.创建AddNewaction方法

在MainController中输入using语句:


usingWebApplication1.Filters;



在MainController中创建AddNewaction方法:

[AdminFilter]

[code]publicActionResultAddNew()
{

CreateEmployeeViewModelv=newCreateEmployeeViewModel();

returnPartialView("CreateEmployee",v);

}

[/code]

3.创建CreateEmployee分部View

在“~/Areas/Spa/Views/Main”中创建新的分部View“CreateEmployee”


@usingWebApplication1.ViewModels.SPA

[code]@modelCreateEmployeeViewModel
<div>

<table>

<tr>

<td>

FirstName:

</td>

[/code]

4.添加jQueryUI

右击项目选择“ManageNugetManager”。找到“jQueryUI”并安装。



项目中会自动添加.js和.css文件



5.在项目中添加jQueryUI

打开“~/Areas/Spa/Views/Main/Index.cshtml”,添加jQuery.js,jQueryUI.js及所有的.css文件的引用。这些文件会通过NugetManager添加到jQueryUI包中。

<head>

[code]<metaname="viewport"content="width=device-width"/>
<scriptsrc="~/Scripts/jquery-1.8.0.js"></script>

<scriptsrc="~/Scripts/jquery-ui-1.11.4.js"></script>

<title>EmployeeSinglePageApplication</title>

<linkhref="~/Content/themes/base/all.css"rel="stylesheet"/>
...

[/code]

6.实现OpenAddNew方法

在“~/Areas/Spa/Views/Main/Index.cshtml”中新建JavaScript方法“OpenAddNew”。
<script>


functionOpenAddNew(){


$.get("/SPA/Main/AddNew").then


(


function(r){


$("<divid='DivCreateEmployee'></div>").html(r).


dialog({


width:'auto',height:'auto',modal:true,title:"CreateNewEmployee",


close:function(){


$('#DivCreateEmployee').remove();


}


});


}


);


}


</script>


7.运行

完成登录步骤后导航到Index中,点击AddNew链接。



8.创建ResetForm方法

在CreateEmployee.cshtml顶部,输入以下代码,创建ResetForm函数:


@modelCreateEmployeeViewModel

[code]<script>
functionResetForm(){

document.getElementById('TxtFName').value="";

document.getElementById('TxtLName').value="";

document.getElementById('TxtSalary').value="";

}

</script>

[/code]

9.创建[b]CancelSave方法[/b]

在CreateEmployee.cshtml顶部,输入以下代码,创建CancelSave函数:


document.getElementById('TxtSalary').value="";

[code]}
functionCancelSave(){

$('#DivCreateEmployee').dialog('close');

}

[/code]

在开始下一步骤之前,我们先来了解我们将实现的功能:

最终用户点击保存按钮

输入值必须在客户端完成验证

会将合法值传到服务器端

新Employee记录必须保存到数据库中

CreateEmployee对话框使用完成之后必须关闭

插入新值后,需要更新表格。

为了实现三大功能,先确定一些实现计划:

1.验证

验证功能可以使用之前项目的验证代码。

2.保存功能

我们会创建新的MVCaction方法实现保存Employee,并使用jQueryAjax调用

3.服务器端与客户端进行数据通信

在之前的实验中,使用Form标签和提交按钮来辅助完成的,现在由于使用这两种功能会导致全局刷新,因此我们将使用jQueryAjax方法来替代Form标签和提交按钮。

寻求解决方案

1.理解问题

大家会疑惑JavaScript和Asp.NET是两种技术,如何进行数据交互?

解决方案:通用数据类型

由于这两种技术都支持如int,float等等数据类型,尽管他们的存储方式,大小不同,但是在行业总有一种数据类型能够处理任何数据,称之为最兼容数据类型即字符串类型。

通用的解决方案就是将所有数据转换为字符串类型,因为无论哪种技术都支持且能理解字符串类型的数据。



问题:复杂数据该怎么传递?

.net中的复杂数据通常指的是类和对象,这一类数据,.net与其他技术传递复杂数据就意味着传类对象的数据,从JavaScript给其他技术传的复杂类型数据就是JavaScript对象。因此是不可能直接传递的,因此我们需要将对象类型的数据转换为标准的字符串类型,然后再发送。

解决方案—标准的通用数据格式

可以使用XML定义一种通用的数据格式,因为每种技术都需要将数据转换为XML格式的字符串,来与其他技术通信,跟字符串类型一样,XML是每种技术都会考虑的一种标准格式。

如下,用C#创建的Employee对象,可以用XML表示为:

<employee></employee><Employee>

[code]<EmpName>Sukesh</EmpName>
<Address>Mumbai</Address>

</Employee>

[/code]

因此可选的解决方案就是,将技术1中的复杂数据转换为XML格式的字符串,然再发送给技术2.



然而使用XML格式可能会导致数据占用的字节数太多,不易发送。数据SiZE越大意味着性能越低效。还有就是XML的创建和解析比较困难。

为了处理XML创建和解析的问题,使用JSON格式,全称“JavaScriptObjectNotation”。

C#创建的Employee对象用JSON表示:

{

[code]EmpName:"Sukesh",
Address:"Mumbai"

}

[/code]

JSON数据是相对轻量级的数据类型,且JAVASCRIPT提供转换和解析JSON格式的功能函数。


vare={

[code]EmpName=“Sukesh”,
Address=“Mumbai”

};

varEmployeeJsonString=JSON.stringify(e);//ThisEmployeeJsonStringwillbesendtoothertechnologies.

[/code]


varEmployeeJsonString=GetFromOtherTechnology();

[code]vare=JSON.parse(EmployeeJsonString);
alert(e.EmpName);

alert(e.Address);

[/code]

数据传输的问题解决了,让我们继续进行实验。

10.创建SaveEmployeeaction

在MainController中创建action,如下:

[AdminFilter]

[code]publicActionResultSaveEmployee(Employeeemp)
{

EmployeeBusinessLayerempBal=newEmployeeBusinessLayer();

empBal.SaveEmployee(emp);


EmployeeViewModelempViewModel=newEmployeeViewModel();

empViewModel.EmployeeName=emp.FirstName+""+emp.LastName;

empViewModel.Salary=emp.Salary.Value.ToString("C");

if(emp.Salary>15000)
{

empViewModel.SalaryColor="yellow";

}

else
{

empViewModel.SalaryColor="green";

}

returnJson(empViewModel);

}

[/code]

上述代码中,使用Json方法在MVCaction方法到JavaScript之间传Json字符串。

11.添加Validation.js引用


@usingWebApplication1.ViewModels.SPA

[code]@modelCreateEmployeeViewModel
<scriptsrc="~/Scripts/Validations.js"></script>

[/code]

12.创建SaveEmployee方法

在CreateEmployee.cshtmlView中,创建SaveEmployee方法:

...

[code]...

functionSaveEmployee(){

if(IsValid()){

vare=
{

FirstName:$('#TxtFName').val(),

LastName:$('#TxtLName').val(),

Salary:$('#TxtSalary').val()

};

$.post("/SPA/Main/SaveEmployee",e).then(

function(r){

varnewTr=$('<tr></tr>');

varnameTD=$('<td></td>');

varsalaryTD=$('<td></td>');


nameTD.text(r.EmployeeName);

salaryTD.text(r.Salary);


salaryTD.css("background-color",r.SalaryColor);


newTr.append(nameTD);

newTr.append(salaryTD);


$('#EmployeeTable').append(newTr);

$('#DivCreateEmployee').dialog('close');

}

);

}

}

</script>

[/code]

13.运行



关于实验35

JSON方法的作用是什么?

返回JSONResult,JSONResult是ActionResult的子类。在第六篇博客中讲过MVC的请求周期。



ExecuteResult是ActionResult中声明的抽象方法,ActionResult所有的子类都定义了该方法。在第一篇博客中我们已经讲过ViewResult的ExecuteResult方法实现的功能,有什么不理解的可以翻看第一篇博客。

实验36——创建单页应用—4—批量上传

1.创建SpaBulkUploadController

创建新的AsyncController“SpaBulkUploadController”


namespaceWebApplication1.Areas.SPA.Controllers

[code]{
publicclassSpaBulkUploadController:AsyncController
{

}

}

[/code]

2.创建IndexAction

在步骤1中的Controller中创建新的IndexAction方法,如下:

[AdminFilter]

[code]publicActionResultIndex()
{

returnPartialView("Index");

}

[/code]

3.创建Index分部View

在“~/Areas/Spa/Views/SpaBulkUpload”中创建Index分部View

<div>

[code]SelectFile:<inputtype="file"name="fileUpload"id="MyFileUploader"value=""/>
<inputtype="submit"name="name"value="Upload"onclick="Upload();"/>

</div>

[/code]

4.创建OpenBulkUpload方法

打开“~/Areas/Spa/Views/Main/Index.cshtml”文件,新建JavaScript方法OpenBulkUpload


functionOpenBulkUpload(){

[code]$.get("/SPA/SpaBulkUpload/Index").then
(

function(r){

$("<divid='DivBulkUpload'></div>").html(r).dialog({width:'auto',height:'auto',modal:true,title:"CreateNewEmployee",

close:function(){

$('#DivBulkUpload').remove();

}});

}

);

}

</script>

</head>

<body>

<divstyle="text-align:right">

[/code]

5.运行



6.新建FileUploadViewModel

在ViewModelSPA文件夹中新建ViewModel”FileUploadViewModel”。


namespaceWebApplication1.ViewModels.SPA

[code]{
publicclassFileUploadViewModel
{

publicHttpPostedFileBasefileUpload{get;set;}

}

}

[/code]

7.创建UploadAction

[AdminFilter]

[code]publicasyncTask<actionresult>Upload(FileUploadViewModelmodel)
{

intt1=Thread.CurrentThread.ManagedThreadId;

List<employee>employees=awaitTask.Factory.StartNew<list<employee>>

(()=>GetEmployees(model));

intt2=Thread.CurrentThread.ManagedThreadId;

EmployeeBusinessLayerbal=newEmployeeBusinessLayer();

bal.UploadEmployees(employees);

EmployeeListViewModelvm=newEmployeeListViewModel();

vm.Employees=newList<employeeviewmodel>();

foreach(Employeeiteminemployees)
{

EmployeeViewModelevm=newEmployeeViewModel();

evm.EmployeeName=item.FirstName+""+item.LastName;

evm.Salary=item.Salary.Value.ToString("C");

if(item.Salary>15000)
{

evm.SalaryColor="yellow";

}

else
{

evm.SalaryColor="green";

}

vm.Employees.Add(evm);

}

returnJson(vm);

}


privateList<employee>GetEmployees(FileUploadViewModelmodel)
{

List<employee>employees=newList<employee>();

StreamReadercsvreader=newStreamReader(model.fileUpload.InputStream);

csvreader.ReadLine();//Assumingfirstlineisheader

while(!csvreader.EndOfStream)
{

varline=csvreader.ReadLine();

varvalues=line.Split(',');//Valuesarecommaseparated

Employeee=newEmployee();

e.FirstName=values[0];

e.LastName=values[1];

e.Salary=int.Parse(values[2]);

employees.Add(e);

}

returnemployees;

}

</employee>

[/code]

8.创建Upload函数

打开”~/Areas/Spa/Views/SpaBulkUpload”的IndexView。创建JavaScript函数,命名为“Upload”

<script>

[code]functionUpload(){
debugger;

varfd=newFormData();

varfile=$('#MyFileUploader')[0];

fd.append("fileUpload",file.files[0]);

$.ajax({

url:"/Spa/SpaBulkUpload/Upload",

type:'POST',

contentType:false,

processData:false,

data:fd

}).then(function(e){

debugger;

for(i=0;i<e.Employees.length;i++)
{

varnewTr=$('<tr></tr>');

varnameTD=$('<td></td>');

varsalaryTD=$('<td></td>');


nameTD.text(e.Employees[i].EmployeeName);

salaryTD.text(e.Employees[i].Salary);


salaryTD.css("background-color",e.Employees[i].SalaryColor);


newTr.append(nameTD);

newTr.append(salaryTD);


$('#EmployeeTable').append(newTr);

}

$('#DivBulkUpload').dialog('close');

});

}

</script>

[/code]

9.运行





总结

七天学会MVC就到这里结束了,谢谢大家的支持,希望大家都能够掌握所讲述的MVC知识,希望都能够进步!

原文链接:http://www.codeproject.com/Articles/1010152/Learn-MVC-Project-in-Days-Day
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航