码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET MVC笔记誊录

时间:2015-10-02 17:20:51      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:

非托管代码:像由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,传到前台去
 3return 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

 
 
 

ASP.NET MVC笔记誊录

标签:

原文地址:http://www.cnblogs.com/hetong/p/4852321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!