标签:
非托管代码:像由c++写的程序直接把二进制代码交给操作系统的内核来处理,叫做非托管代码
托管代码:运行在CLR下面的代码叫托管代码,由CLR来对代码进行异常等处理,编译成平台代码
匿名函数:
public delegate int AddDel(int a,int b);
简单委托:
AddDel delDemo=new AddDel(AddInt)
public int AddInt(int a,int b)
{
return a+b;
}
泛型委托,一般用于约束返回值和传入的参数
public delegate T2 AddDemo<T1,T2>(T1 t1,T2 t2);
AddFunc<int,bool>(2,false);
泛型方法:如果不指定方法泛型的类型,那么在传递参数的时候会自动给类型
AddFunc(2,true);
泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
采用特殊的占位符来表示范型类型
C#泛型特点:
1、如果实例化泛型类型的参数相同,那么JIT编辑器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。
2、C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术。
3、C#的泛型采用“基类、接口、构造器,值类型/引用类型”的约束方式来实现对类型参数的“显示约束”,提高了类型安全的同时,也丧失了C++模板基于“签名”的隐式约束所具有的高灵活性
泛型接口:
泛型接口的类型参数要么已实例化,要么来源于实现类声明的类型参数
泛型委托:
泛型委托支持在委托返回值和参数上应用参数类型,这些参数类型同样可以附带合法的约束
C#泛型继承:
C#除了可以单独声明泛型类型(包括类与结构)外,也可以在基类中包含泛型类型的声明。但基类如果是泛型类,它的类型要么以实例化,要么来源于子类(同样是泛型类型)声明的类型参数,看如下类型
class C<U,V>
class D:C<string,int>
class E<U,V>:C<U,V>
class F<U,V>:C<string,int>
class G:C<U,V> //非法
E类型为C类型提供了U、V,也就是上面说的来源于子类
F类型继承于C<string,int>,个人认为可以看成F继承一个非泛型的类
G类型为非法的,因为G类型不是泛型,C是泛型,G无法给C提供泛型的实例化
泛型类型的成员:
泛型类型的成员可以使用泛型类型声明中的类型参数。但类型参数如果没有任何约束,则只能在该类型上使用从System.Object继承的公有成员
泛型方法:
1、C#泛型机制只支持“在方法声明上包含类型参数”——即泛型方法。
2、C#泛型机制不支持在除方法外的其他成员(包括属性、事件、索引器、构造器、析构器)的声明上包含类型参数,但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数。
3、泛型方法既可以包含在泛型类型中,也可以包含在非泛型类型中。
泛型方法声明:如下
public static int FunctionName<T>(T value){...}
类型参数的约束 :
下表列出了五类约束:
约束 描述
where T: struct 类型参数必须为值类型。
where T : class 类型参数必须为类型。
where T : new() 类型参数必须有一个公有、无参的构造函数。当于其它约束联合使用时,new()约束必须放在最后。
where T : <base class name> 类型参数必须是指定的基类型或是派生自指定的基类型。
where T : <interface name> 类型参数必须是指定的接口或是指定接口的实现。可以指定多个接口约束。接口约束也可以是泛型的。
c:\framework4.0\aspnet_regiis.exe 下面的
在运行命令中,输入路径:c:\...aspnet_regiis.exe -i 注册iis 安装aps.net iis
工作进程:
iis5:aspnet-wp.exe
ii6:w3wp.exe
ecb:操作系统的句柄
插件过滤模型:安装iis的时候在操作系统的注册表中注册了插件,然后交给IIS
去处理,iis根据后缀交给aspnet_isapi.dll去处理,然后一步步把响应返回
内核模块=》iis过滤器=》axpnet
EF(Entity Framework)实体框架:早期的对象关系映射
是ado.net中
mono:编译解析适用于应用于各种平台的代码,转换成java等平台的程序代码
ORM的全称是Object Relational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,
并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),
\通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,
ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。
ORM框架:实现ORM思想的框架:EF Nhiberate
CRUD(Creat Read Update Delete)
select * from userinfo where id>2 执行循序:
先定位到表formuserinfo,再id>2过滤,然后select
Linq(读link)
//遍历后面的userinfozhge这个集合,用b来代表遍历的
每个元素,当满足where条件的元素就选择出来
var data=from b in db.userinfo
where b.id>2
select b
//输出data中的值
foreach(var userinfo in data)
{
cw"{0}-{1},userinfo.id,userinfo.name";
}
相当于:foreach(var b in userinfo)
{
if(b.id>2)
{
cw"{0}{1},b.id,b.name";
}
}
查询单个实体
data.Single(不是一个的时候报异常)
data.SingleOrDefault(为空的时候不报异常)
varchar(8000) ‘a‘ 存储一个字符1个字节 数据库中存储单位:页:8kb
nvarchar(4000) ‘a‘ 存储一个字符2个字节
EF:本质是帮我们生产sql脚本,交给数据库处理
跨数据库
根据模型创建数据库
如果数据中有数据。不要再文件上右击执行sql,
要不然会把表里的数据全部删除
根据模型生成数据库,根据生成的sql语句再去看情况个表
逻辑删除:改变状态update
物理删除:delete
customer.DelFlag=0//魔鬼数字
使用include会自动将2个表进行join
ToList()//本地内存中
所有的请求都会归结于控制器下的action(接收用户的请求,调用bll层逻辑
交给页面的数据)
请求的url映射:注册路由:http://localhost:80/Home[控制器controller]/Index[action]/[id]//带参数
把前台和后台的代码进行分离
比如前台的datagrivd与后台的this.dategride进行分离,不会影响,降低耦合
前台文件继承:page类
后台action继承controler,继续自IController接口
app_data:将数据文件(数据库文件)放在其中,用户是不能直接访问该目录,安全
控制器:HomeContorl类继承controller类
以controller结尾
不是静态类
必须实现IController接口
public ActionReslut Index() { viewdata["message‘]="nihao"; return View(); }
此时如果不指定页面(return View())来展示控制器action后的结果,那么就是要与action名字相同的页面来显示,(就是默认使用当前页来显示)
如果指定页面return View(“Index”)则交给index页面来展示处理后的结果
webfrom 与mvc的区别:
请求地址不一样
mvc请求的是控制器下面的action
webfrom请求的是aspx页面或一般处理程序
MVC执行的过程:
浏览器请求控制器中的 Action (//ActionResult 后面的方法 index());
将调用BLL =》DAL数据取出来填充到viewdata["msg"]中,然后返回给试图 return view(),传给前台,前台用<%=viewdata["msg"]>来接受
步骤:
1、所有的请求都归结到Action里面
如何页面是否被重命名,都不影响请求,如果View/Home/下的页面没重命名为index2,但是依然访问index() 这个action
public ActionResult Index()//调用index方法
{
//this.request["key"]//处理用户的请求
//访问BLL,返回数据给赋给viewdata,传到前台去
2、viewdata["msg"]="nihao";//返回数据给赋给viewdata,传到前台去
3、return view("Index");//返回到view 中的Index页面去处理。如果不写则返回给的当前的action:index页
}
4、前台文件index.aspx通过<%=viewdata["msg"]%>//来显示action处理后的数据
前台文件继承:page类
后台action继承controler,继续自IController接口
public ActionResult About()
{}
Application_start()
:第一次请求的时候被调用,httpapplicationFactory创建之后
调用此方法,所在实例是一个特殊的httpapplication,
在一个特殊的应用程序池
都是处理静态的字段,类型,集合
适合放置只创建一个实例的类型或方法
在controller类型中,在action上右击生成试图,就可以直接在view中生成该同名的aspx页面
约定大于配置,可以使用配置:straus
约定:
aspx模板文件在控制器自己的文件夹下面
控制器下面的每个action一般对应一个view中的一个aspx模板文件
当前控制器到自己的控制器文件中收索,收索不到就到Shared文件下收索,再收索不到报错
MVC中没有服务端控件,没有viewstate,(也可以开启:在page头中EnableViewState=true)
设置textbox的textchange事件,自动提交,要设置文本框的autopostback=true属性
在aspx 中class 是关键字所以要加@class="demo"
前台可以使用
生成一个超链接<a href="<%:url.Action("Index","Home")%>">跳转</a>//绑定名字为HOME控制器下的名称为Index action
生成一个超链接<%: Html.ActionLink("连接","Index[action]","Home[控制器]",new {name="nihao"[?参数]},new {id="link",style="color:red",@class="demo"}[属性id 和样式])%>
htmlhelper
生成一个文本框
<%:html.TextBox("txtName")%> 设置textbox的id和name属性为txtName
男:<%:Html.RadioButton("gander",1,true)%>//生成一个单选项
男:<%:Html.RadioButton("gander",2,false)%>单选,名称要相同,排斥
<%:html.dropdownlist("city")%>//下拉框,传集合city
viewdata["city"]=new list<selectlistitem>
{
new selectlsititem(){selected=false,text="北京,value="1"}
new selectlsititem(){selected=false,text="天津,value="2"}
}
通过对象实体来传值,只要设置文本框的name属性的值为对象属性相同即可动态绑定文本框的值
根据文本框的name属性的值,自动将文本框的值自动封装成对象,传给后台控制器下的action
<td>订单编号:</td><td><input type="text" name="ID"></td>
<td>订单名:</td><td><input type="text" name="OrderName"></td>
<td>时间:</td><td><input type="text" name="SubTime"></td>
//此时要注意属性值与对象属性的大小写
后台:public actionresult ProessAddOrder(Order order)
{
//处理传过来的对象,添加到数据库中
}
前台也可以写成
<%:html.textboxFor(m=>m.Id)%>
<%:html.textboxFor(m=>m.OrderName)%>
为什么可以点出来,因为m是order类型,页面头文件中继续了泛型viewpage<T>,本页上viewpage<Order>类型
使用可以带你出来
后台装配order对象
viewdata.model=new order(){id=2,name="21313"};
return view();//输出到前台
页面头文件中继续了泛型viewpage<T>,本页上传递viewpage<Order>类型
前台:<%:model.Id%>
<%:model.OrderName%>进行输出
传递对象到前台:
1、使用Viewdata.model=cityInfo return view()//传递对象实体
2、使用return view(customer);//传递强类型
public ActionResult Details(int id) { //根据id来查询此实体并传递到前台页面的展示 var clityList=(from c in db.CityInfo where c.id==id select c).FirstOrDefault(); viewdata.model=cityList; return view(); //return(clityList) }
注意:
在以.cshtml后缀的文件中,直接用“@”符号 ,如@Model.LoginId来接受后台传过来的值(<input type="text" name="txtLoginId" value="@Model.LoginId" />)
在以.aspx后缀的文件中用,直接用“<%: %>”,如<%:item.LoginId %>来接受后台传传过来的值
<%:Html.TextBoxFor(m => m.OName)%>//使用自带的获取值或提交值的时候封装成对象
<input type="text" name="OName" /></td>//使用name=对象属性名 来封装成对象提交文本框中的值到后台,用这个value=<%:m=>m.id%>来获取值,不知道对不对
.cshtml文件中:
Html.TextBoxFor(C=>C.LoginId)//获取值或提交值的时候自动封装成对象
<input type="text" name="LoginId" value="@Model.LoginId" /> //存html时用@Model.LoginId来获取值和用name="LoginId属性名来封装成对象交到后台去处理
return view()//返回页面给前台
return content("nihao")//输出一个字符串到前台
public ActionResult ProcessPost() { var name=request["txtname"]; var pwd=request["txtpwd"]; return content(string.format("{0}-{1}",name,pwd)); }
当action用[httppost]标签来标识的 时候表示只处理post请求(优先处理post)
没有标识的 时候(任何形式的请求)get,post都可以处理,都是一般都处理get
GPR原则: GET POST Redirect,get过来先让用户看下添加的页面,输入添加数据,后一点提交post,添加后跳转
等号:<%=viewdata["key"]%>//输出里面的值
冒号:<%:viewdata["key"]%>//输出html标签,放xss注入
扩展方法的三要素:
静态类,静态方法,this
前台页引用命名空间<%@ import namespace="mvcapplication.models"%>
//扩展方法的命名空间我们都是让其跟所要扩展类的命名空间一致
//封装一个标签方法: txt <span>txt</span>
//this 指向的是要扩展的类型
//扩展的类型的实例是怎么传的:谁调这个方法,那么
public static string GetMyLable(this HtmlHelper helper ,string txt)
{
return string.Format("<span>{0}</span>", txt);
}
创建实例:1、new 2、调用静态方法时,内部帮我们创建类的实例
3、工厂车间类的实例
<%for(int i=0;i<10;i++)
{%>
<%}%>
var temp=from c in db.userinfo where c.id>1 select c//此时不会数据库中不会执行查询语句,到右面用到的时候才去执行脚本
var temp=from c in db.userinfo.ToList//运行到此的时候,会把数据加载到内存中去,然后根据条件到内存中查找内存来做过滤
where c.id>1 select c
ToList/ToArrry AsEnumable:本地内存型的集合,集合初始化后,立即将数据输出到内存里面来
IQueryable接口每次执行的时候到数据库中查询
IQueryable<userinfo> temp=from c in db.userinfo where c.id>1 select c
//linq返回的是IQueryable接口
IQueryable接口是离线数据,provider就去解析linq表达式,然后生成sql脚本,并查询数据库,每次遍历都做查询
//查询表中的某几列,还可以把student分组后的count数量查询出来
var temp=from c in db.userinfo
select new{ID=c.id,myremark=c.remark,num=c.student.count}
foreach(var variable in temp
{
cw("id:{1} count:{2}",variable.id,variable.num);
}
//lambad实现
var temp=db.userinfo.where<userinfo>(c=>c.id>0&&c.id<10)
.select(c=>new{id=c.id,name==c.name});
foreach(var varable in temp)
{
cw(varable.id);
}
分页查询:
var pagedata=db.userinfo
.where<userinfo>(c=>c.id<20)//过滤
.orderByDescending(c=>c.id)//降序排列
.skip<userinfo>(2)//跳过2条
.take<userinfo>(2)//取2条
insert into Customer() select name,id from Orders
--先备份customer表,再把数据放回去
select * into customerbak form customer
//异步请求
$.post
$.get
$.getJSON()
$.ajax()
$("#div").load();
前台
删除超链接传id值
<table>
<tr><td>编号</td><td>名字</td><td>删除标识</td><td>操作</td></tr>
<% foreach(var item in Model)
{%>
<tr>
<td><%:item.ID%></td>
<td><%:item.CusName%></td>
<td><%:item.DelFlag%></td>
<td><a href="/Customer/DelteCustomer?id=<%:item.ID%>" class="dellink">删除</a></td>
</tr>
<%}%>
</table>
public actionresult del(int id){}
//如果是参数名是id,则符合global文件中url规则中的id占位符:/控制器/action/id,直接采用这种url规则传参数
//如果参数名不是id,而是wid,则采用/控制器/action?wid="",来传递参数
注释:
服务端注释<%-----%>//不会随报文发送给客户,尽量采用这个注释
客户端注释<!------>//发送给客户,会在浏览器上显示的注释。让费带宽
@*Html.TextBoxFor(C=>C.LoginId)*@
前台根据文本框或其他控件的name属性名(必须保持与实体对象属性的名字一样)
自动封装到实体对象中,传给action来处理
隐式异步请求
在前台的html直接加属性:data-ajax="true" data-ajax-confirm="确定要删除吗";
在mvc3中使用@{//要执行的c#代码}
使用@model.id,来获取在值,与mvc中的<%:%>效果是一样的
1、JQ 客户端验证:
//添加jquery-1.5.1.js
//jquery.validate.js
$(function () {
//js的校验
$("#frmAdd").validate({
rules: {//下面文本框的校验的规则
txtName: {//所有的校验规则,以及错误消息都是用 表单标签的name属性
required: true ,
rangelength: [5, 10],
remote: "/Validate/CheckUserIsExist"
},
txtMail: {
required: true,
email:true
},
txtPwd2: {
equalTo: "#txtPwd"//使用id选择器指向一个新的标签:验证此标签和目标标签的value是否相同
}
},
messages: {//校验失败的错误消息
txtName : {
required:"*必填",
rangelength:"范围必须是5-10,爷看着点!",
remote:"*大爷,此用户名被占用了,再搞个别的吧!"
},
txtMail:"*爷您知道啥是邮箱吗?",
txtPwd2:"大爷,两次密码得一致!"
}
});
});
2、使用微软mvc自带的客户端校验方式:
//添加jquery-1.5.1.min.js
jquery.validate.min.js
jquery.validate.unobtrusive.min.js
@*如果使用的是mvc2 一定要再前端启动客户端校验*@
@{ Html.EnableClientValidation(); }
而mvc3 在globle中文件中有配置了,为true
对实体对象UserInfo的约束:
//微软提供的校验方式
public class UserInfo
{
public int Id { get; set; }
[StringLength(10,ErrorMessage = "*最大长度是10")]//字符串的长度的校验
[Required(ErrorMessage = "*哥这是必填项....")]//必填的特性
public string TName { get; set; }
[RegularExpression(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$",ErrorMessage = "*爷,得输入一个邮箱,知道邮箱吗?")]//正则表达的校验
public string Mail { get; set; }
//数字范围校验
[Range(10,100,ErrorMessage = "只能是10到100才行!")]
public int Age { get; set; }
}
前端: <div class="editor-field">
@Html.EditorFor(model => model.TName)
@Html.ValidationMessageFor(model => model.TName)
</div>
路由注册在global文件中的application_start()//第一次请求,也就是应用程序一开始被执行的时候,
第一次请求注册了路由规则到路由表的静态集合里面去了,后面所有的请求再来访问路由规则表的时候,就可以进行匹配了
路由规则想怎么变就这么变,实现伪静态
{controller}/{action}.html//url重写。静态
路由规则:路由的名字,路由规定的的url地址的格式,url地址默认值,一些约束
路由数据:http://location/home/about ,匹配规则模板的相关数据
路由规则集合:RouteCollention
路由表:里面的有个静态的路由规则集合属性routeTable,也是来存放路由规则的
路由规则的约束 new{controller=@"\d+"},new string[]{aspnetmvc.controller},约束到指定的命名空间下收索控制器
UrlRouteModule:根据路由表里面静态路由规则集合属性存放的路由规则进行匹配
RouteDate:请求的控制器的名字改和action的名字,其他的参数
路由规则可以有多条
从上到下按循序进行匹配
1、路由规则是有循序的,如果被第一条路由规则匹配后,后面的规则就无视
2、路由规则里面的参数是可以进行约束的,controller必须是整数(正则表达式)
new {controller=@"\d+"}
{controller}/{action}/{id} 主要以{controller}/就可以匹配到第一个
{*allcatch}:匹配所有的
如果在子区域中,主程序中存在相同的的控制器和acton,
那么可以在约束路由的参数的命名空间
aop:面向切面的编程
spring.net框架
把原先的代码切断,然后去执行另一段代码,执行完后,又返回到原来的方法中的执行位置执行
应用场景:记录日志,异常处理,开启事务。事务处理,行为记录
如果出现异常,会铺获,然后交给处理异常的代码中去执行
先执行全局的过滤器=》控制器的过滤器=》action的过滤器
离的最近的的过滤器才会起作用,如果控制器和action都没有,就只会执行全局的,如果action没有,控制器有,则会执行控制器的
OnActionResult(ing,ed):action执行之前,后之后
OnResultExecute(ing,ed):页面渲染前后执行
Controller中调用action返回ActionResult
,执行executeResult方法
路由hander:职责:获取最后处理请求的一般处理程序的prHander
Vss源代码管理:
=》将源代码添加到VSS中
=》下载最新的代码,右击解决方案-递归下载最新=》迁出
=》Lock
=》编辑=》提交=》=》签入=》unLock
生成的dll放到相同的文件夹中,然后删除掉原来的引用
重新添加单个项目的从文件夹中dll的引用
单个项目的生成与其他无关
设置项目的依赖循序:右击解决方案,设置项目的依赖性,按顺序生成
T4模板:生成相同的源代码,编辑模板,然后保存,即可生成代码,然后添加相应的类,把代码复制进去即可,注意使用分布类
SKU: SKU=Stock Keeping Unit(库存量单位)
log4net的应用:
1、添加引用 2、在web.config文件中配置login4net的相关配置
3、在global文件中 的application_start方法中应用程序一开始初始化一个下log4net的配置
调用它的configure()方法
4、自定义一个处理错误的属性类,继承自handleErrorAttribute,重写onException(ExceptionContext filterCotext)方法
在方法中调用 ILog log=log4net.LogManager.GetLogger("log")方法来记录错误信息
log.Error(filterContext.exception.tostring())
5、发生错误后跳转到定制的错误页filterCotext.HttpContext.Response.redirect("Error.html")
jQueryEasyUI的应用:
jQueryUI和jQueryEasyU是相互冲突的,2者不能混用
添加css和js文件:
<link href="../../Content/JQEasyUI/themes/default/easyui.css" rel="stylesheet" type="text/css" />
<link href="../../Content/JQEasyUI/themes/icon.css" rel="stylesheet" type="text/css" />
<script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.easyui.min.js" type="text/javascript"></script>
<script src="../../Scripts/easyui-lang-zh_CN.js" type="text/javascript"></script>
解决json循环依赖递归序列化的的方法:1、使用第三方的控件json.net,2、在查询所有出来的数据中,通过选择要的部分属性,把导航属性去掉
var temp=from c in userinfoService.LoadEntities(u=>true)
select new{c.id,c.errorTimes,c.lastLoginTime,c.Phone,c.Pwd,c.Remark}
var data=new{total=temp.Count(),rows=temp};
return json(data);
后台返回json,就通过return json(data);
WebServers:应用场所:要调用的系统添加对webservice的服务引用,实例化这个服务,调用里面的方法
1、单点登录,一个地方登录了,其他系统可以得到用户状态
2、跨平台,跨语言,穿透企业防火墙
3、webserveice集群,去调用不同服务器上的bll=>dal提高业务处理的能力
调试附加到进程w3wp.exe中,来调试webservice中代码jq
标签:
原文地址:http://www.cnblogs.com/hetong/p/4852321.html