Student s=new Student{Age=12,Name="wo"};
List<string> list=new List<string>{"","",""};
/*检查2次类型*/
if(a is Employee)
Employee b = (Employee)a;
/*检查1次类型*/
Employee b = a as Employee;
if (b != null)
private string name;
public string Name
{
get{return name;}
set{name=value}/*value代表总是新值*/
}
/*自动实现的属性,无需显式的定义字段,编译器会自动定义*/
public string Name{get;set;};/*get,set后面的;相当于括号{}*/
class B : A
{
private int age;
public B():base()/*base()可省略*/
{
age=1;
}
public B(int num):this()
{
}
}
public static class StringExtensions
{
public static void Name(this String st,int num)
}
public Int32 Add(params Int32[] values)
{
Int32 sum=0;
if(values != null)/*判断是否没有参数*/
{
for (Int32 x=0;x<values.Length;x++)
{
sum+=values[x];
}
}
return sum;
}
/*调用方法*/
Int32 sum = a.Add(1,2,3);
public static void swap<T>(ref T o1,ref T o2)
{
T temp = o1;
o1 = o2;
o2 = temp;
}
/*调用时:
Generic.swap<string>(ref a,ref b);
Generic.swap(ref a,ref b);泛型类型实参可以省略,编译器可以自动推断
*/
}
## 接口和委托
* 1.接口(CLR不支持多继承,接口则是“缩水版多继承”)
* 基本特性:
* 接口只是定义了方法,不提供具体实现,而继承接口的类必须显示的实现方法,相当于
* 接口 = 做什么,但不指定你怎么做,属于高级领导,光说话不干事
* 类实现 = 完成接口规定的任务,属于具体办事的,但必须完成领导安排的
* 接口不能实例化,是一种特殊的引用类型
* 值类型可以实现接口,但必须进行装箱
* 凡是使用【基类型实例】的地方,都能使用【派生类型实例】
* 凡是使用【具名接口类型】的地方,都能使用【实现接口的一个类型实例】
```csharp
Animal a = new Dog();
IList<string> = new List<string>();
```
* 定义和实现接口(约定接口名以I开头)
``` csharp
public interface IAnimal /*接口类型的修饰符只能是public,可以省略*/
{
/*接口成员只可以有 方法(包括一般方法和属性),事件;
接口成员访问修饰符必须是public(可以省略),不可以有修饰符static,继承修饰符(abstract,virtual和override);
接口成员不能有具体实现,只能定义;
*/
void Do(string dosomething);
}
class Dog : IAnimal
{
/*类型实现的接口成员必须是显示的标记为public;
若不显示的标记 virtual,编译器会将其标记为virtual 和 sealed不让派生类继承和重写此成员;
若显示的标记 virtual,编译器只会将其标记为virtual,允许派生类重写
*/
public void Do(string dosomething);
}
```
* 泛型接口
* 类型安全,相对于非泛型接口的Object参数
* 处理值类型装箱次数会变少
* 类可以实现一个泛型接口若干次,例如同时实现:IList<string>,IList<int>
* 实现多个具有相同方法名和签名的接口:须在实现的类中显示的实现出来,如 void IList.Dosomething(){}
* 显示实现接口的利弊(EIMI)详见13.9,13.10
* 设计:基类还是接口
* IS-A关系:属于,应该用基类
* CAN-DO关系:能做某事,应该用接口
* 2.委托(.NET Framework通过委托来提供回调函数机制,委托确保类型安全)
* 入门参考(http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx)
* 简单示例
```csharp
/*委托类型相当于是定义一个代表(一组参数和返回值相同的方法)类型,可作为参数传递给任何一个方法,委托类型代表的是具有规定参数和返回值的方法;注:方法签名由方法名称和一个参数列表(方法的参数顺序和类型)组成*/
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate {
/*定义委托,它定义了可以代表的方法的类型(参数和返回值),dlegate相当于class,GreetingDelegate是一个委托类型*/
public delegate void GreetingDelegate(string name);
class Program {
private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name) {
Console.WriteLine("早上好, " + name);
}
/*注意此方法,它接受一个GreetingDelegate委托类型的方法作为参数*/
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
static void Main(string[] args) {
/*调用以委托类型作为参数的方法,传递的实参可以是满足委托类型的任何方法(即参数和返回值相同)*/
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("张子阳", ChineseGreeting);
Console.ReadKey();
}
}
}
输出如下:
Morning, Jimmy Zhang
早上好, 张子阳
```
* 委托优势:委托是一种类型,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性
* 委托类型可以实例化后,绑定若干具有相同返回值和参数的方法,相当于这些方法的指针
```csharp
/*声明委托,分别赋值*/
GreetingDelegate delegate1, delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;
GreetPeople("Jimmy Zhang", delegate1);
GreetPeople("张子阳", delegate2);
/*声明委托,一个委托实例可以绑定多个方法,有顺序*/
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; /*先给委托类型的变量赋值*/
delegate1 += ChineseGreeting; /*给此委托变量再绑定一个方法*/
GreetPeople("Jimmy Zhang", delegate1);
delegate1 = EnglishGreeting; /*先给委托类型的变量赋值*/
delegate1 += ChineseGreeting; /*给此委托变量再绑定一个方法*/
delegate1 ("Jimmy Zhang");/*将先后调用 EnglishGreeting 与 ChineseGreeting 方法*/
```
* 委托类型实例化后既可以绑定方法也可以取消绑定 delegate1 -= EnglishGreeting;
* 事件:Event,定义委托类型实例化后的变量,是类型成员
* 一般使用事件方法:
* 在类的内部:给事件注册方法可以用"="和"+=",注销方法用"-="
* 在类的外部:给事件注册方法只能用"+=",注销方法用"-="
* 触发事件:事件名(传入实参);
* 示例:
```csharp
MakeGreet += Do;/*给事件注册方法:Do是方法名*/
MakeGreet("123");/*触发事件,会调用执行所有注册在此事件上的方法*/
```
* C#使用事件标准:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Mail
{
/*需要 传递附加信息 给 已注册事件的方法 时,建立新类(继承自EventArgs)容纳信息;
若不需要传递附加信息,则可以直接使用 EventArgs.Empty
*/
class NewMailEventArgs : EventArgs
{
private readonly string m_from, m_to, m_subject;
public string From { get { return m_from; } }
public string To { get { return m_to; } }
public string Subject { get { return m_subject; } }
public NewMailEventArgs(string from, string to, string subject)
{
m_from = from;
m_to = to;
m_subject = subject;
}
}
class MailManager
{
/*
泛型委托EventHandler<T>,定义如下:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
所以方法原型必须符合 返回值void,参数为object sender和TEventArgs e,即满足:
void MethodName(object sender, TEventArgs e){};
*/
/*定义事件成员*/
public event EventHandler<NewMailEventArgs> NewMail;
/*定义引发事件方法*/
protected virtual void OnNewMail(NewMailEventArgs e)
{
/*出于委托线程安全,不直接使用事件NewMail
EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail);
if (temp != null)
temp(this, e);*/
e.Raise<NewMailEventArgs>(this, ref NewMail);
}
/*定义方法将输入转化为期望事件*/
public void SimulateNewMail(String from,string to,string subject)
{
NewMailEventArgs e = new NewMailEventArgs(from,to,subject );
OnNewMail(e);
}
}
/*扩展委托线程安全*/
public static class EventArgExtensions
{
public static void Raise<TEventArgs>(this TEventArgs e, Object sender, ref EventHandler<TEventArgs> eventDelegate)
{
/*出于委托线程安全,不直接使用事件NewMail*/
EventHandler<TEventArgs> temp = Volatile.Read(ref eventDelegate);
if (temp != null)
temp(sender, e);
}
}
/*给事件注册方法*/
class Fax
{
public Fax(MailManager mm)
{
mm.NewMail += FaxMsg;
}
private void FaxMsg(object sender, NewMailEventArgs e)
{
Console.WriteLine("Faxing mail message:");
Console.WriteLine("From={0},To={1},Subject={2}", e.From, e.To, e.Subject);
}
public void Unregister(MailManager mm)
{
mm.NewMail -= FaxMsg;
}
}
/*触发事件*/
class Program
{
static void Subject(object sender,NewMailEventArgs e)
{
Console.WriteLine(sender);
Console.WriteLine(e.From +"\n"+e.To +"\n"+e.Subject);
}
static void Main(string[] args)
{
MailManager manager = new MailManager();
manager.NewMail += Subject;
Fax s = new Fax(manager );
s.Unregister(manager);
manager.SimulateNewMail("icql@qq.com","37612949@qq.com","test");
Console.ReadKey();
}
}
}
lambda表达式演变过程 ``` \匿名方法 Func<int,int,int> funcDemo = delegate(int a, int b){return a + b;}; \lambda语句 Func<int,int,int> funcDemo = (int a, int b) => {return a + b;}; \lambda表达式 Func<int,int,int> funcDemo = (int a, int b) => a + b; Func<int,int,int> funcDemo = (a,b) => a + b;
无参数lambda () => 语句;
/*枚举类型不能定义任何方法(包括属性),事件*/
/*枚举类型相当于是常量值,编译时会直接把枚举符号替换为数值*/
public enum Color
{
Write=1,Red,Green,Blue=1,Orange
}
/*枚举值只能是int类型,不赋值时默认值是0,1,2,3...*/
Color c = Color.Blue;/*实例化*/
int i = (int)c;
/*定制特性:必须继承System.Attribute,最好以Attribute结尾,必须至少要有一个公共构造器
定制的特性类必须应用System.AttributeUsageAttribute类的实例
此特性类有两个默认构造器,第1个参数的是表明特性应用的类型种类,后面的参数用来设置属性值,
AllowMultiple属性用来设置是否可以对选定的元素多次应用该特性,InHerited属性用来设置特性应用基类时,是否应用它的派生类和重写方法
*/
[AttributeUsage(AttributeTargets.Class,Inherited=false,AllowMultiple=true)]
public class FlagsAttribute : System.Attribute
{
public FlagsAttribute() { }
}
class Car
{
/*析构函数
不能在结构中定义析构函数。只能对类使用析构函数
一个类只能有一个析构函数
无法继承或重载析构函数
无法调用析构函数。它们是被自动调用的
析构函数既没有修饰符,也没有参数
*/
~Car()
{
/* cleanup statements...*/
}
}
/*默认调用析构函数时,实际执行的代码如下*/
protected override void Finalize()
{
try
{
/*Cleanup statements...*/
}
finally
{
base.Finalize();
}
}
File.Delete(“Temp.dat”); ```
Thread t = new Thread(delegate ()
{
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
Thread.Sleep(2000);
}
});
t.IsBackground = true;
//仅仅是告诉操作系统,该线程已经准备好了,实际什么时候执行,看操作系统的根据自己的优先级去执行
t.Start();
* 1.ADO.NET组成
* 数据提供程序(常用类)
* Connection, 用来 连接 数据库
* Command, 用来执行 SQL语句
* DataReader, 只读、只进的结果集,一条一条读取数据(StreamReader、XmlReader类库中这些Reader的使用方式差不多)
* DataAdapter, 一个封装了上面3个对象的对象
* 执行方法
[ExecuteNonQuery、ExecuteScalar和ExecuteReader(Reader的特性)](http://blog.csdn.net/gengyudan/article/details/11890319)
* 数据集(DataSet),临时数据库,断开式数据操作
* 2.原始操作数据库过程:
string conStr = "Data Source=A6924;Initial Catalog=TEST;User Id=sa;Password=006924";/*创建连接字符串*/
using (SqlConnection con = new SqlConnection(conStr))/*创建连接对象*/
{
string sql = "";/*sql语句*/
using (SqlCommand cmd = new SqlCommand(sql, con))/*创建Command对象*/
{
con.Open();/*打开数据库*/
/*不返回数据*/
cmd.ExecuteNoQuery();
/*返回单个数据*/
string result=cmd.ExecuteScalar();
/*返回多行多列*/
using (SqlDataReader reader = cmd.ExecuteReader())/*创建reader对象,执行操作*/
{
if (reader.HasRows)/*判断是否查询到数据*/
{
while (reader.Read())
{
string parm = reader.GetString(0);
...
}
}
}
}
}
* 3.参数化sql语句
* T-SQL语句中,参数用 @参数名 代替
select count(1) from 表名 where loginId=@loginId and loginPwd=@loginPwd
* 给参数赋值(2种)
/*推荐使用*/
SqlParameter paramLoginId = new SqlParameter("@loginId",SqlDbType.Varchar,50){Value=值}
SqlParameter[] pms=new SqlParameter[]
{
new SqlParameter("@loginId",SqlDbType.Varchar,50){Value=值},
new SqlParameter("@loginPwd",SqlDbType.Varchar,50){Value=值}
}
cmd.Parameters.Add(paramLoginId);
cmd.Parameters.AddRange(pms);
/*直接使用*/
cmd.Parameters.AddWithValue("@loginId",值)
** 4.连接池
* 5.向数据库中插入null值:不能直接使用 C# 中的 null,必须使用 DBNull.Value
* 6.DataAdapter:DataAdapter是一个封装了3个(Connection,Command,DataReader)的对象,使用时只需2个参数(sql语句,连接字符串conStr)
string conStr = "Data Source=A6924;Initial Catalog=TEST;User Id=sa;Password=006924";
string sql = "select * from NE_CARD_FULLCARDINFO";
DataTable dt = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql,conStr))
{
adapter.Fill(dt);
}
this.dataGridView1.DataSource = dt;
* 7.DataSet和DataTable
* DataSet:临时数据库,存储在内存的数据库
* DataTable:DataSet中表
* 8.封装sqlHelper
* 1.完整封装SqlHelper
[SqlHelper.cs](https://github.com/chenqinglin93/File-backup/blob/master/App_Code/SqlHelper.cs)
[OracleHelper](https://github.com/chenqinglin93/File-backup/blob/master/App_Code/OracleHelper.cs)
* 2.简单封装SqlHelper
添加引用System.Configuration
using System.Data.SqlClient;
using System.Configuration;
public static class SqlHelper
{
/*定义连接字符串,
readonly修饰的变量,只能在初始化时赋值,以及在构造函数装赋值,其他地方只读,
增加配置文件
<connectionStrings>
<add name="NewEnergyConnectionString" connectionString="Data Source=A6924;Initial Catalog=TEST;User Id=sa;Password=006924" providerName="System.Data.OracleClient"/>
</connectionStrings>
*/
private static readonly string conStr = ConfigurationManager.ConnectionStrings["NewEnergyConnectionString"].ConnectionString;
/*1.执行增(insert)删(delete)改(update)*/
/*private static int ExecuteNonQuery(string sql,dynamic param = null)*/
public static int ExecuteNonQuery(string sql, params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}
/*2.执行查询,返回单个值*/
public static object ExecuteScalar(string sql, params SqlParameter[] pms)
{
using (SqlConnection con = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
con.Open();
return cmd.ExecuteScalar();
}
}
}
/*3.执行查询,返回多行多列*/
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] pms)
{
SqlConnection con = new SqlConnection(conStr);
using (SqlCommand cmd = new SqlCommand(sql, con))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
try
{
con.Open();
/*System.Data.CommandBehavior.CloseConnection这个枚举参数表示将来使用完SqlDataReader后,在关闭reader的同时,SqlDataReader内部关联的Connection对象也关闭掉*/
return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
catch
{
con.Close();
con.Dispose();
throw;
}
}
}
/*4.执行查询,返回DataTable*/
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] pms)
{
DataTable dt = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conStr))
{
if (pms != null)
{
adapter.SelectCommand.Parameters.AddRange(pms);
}
adapter.Fill(dt);
}
return dt;
}
}
### Controller控制器
### View视图
* ViewBag、ViewData和ViewDataDictionary
* ViewDataDictionary是一个特殊的字典类,ViewData是它的实例,ViewBag是ViewData的动态封装器
* ViewBag.Date等同于ViewData["Date"],两者的重要区别在于ViewBag是动态的,不具有真正的类型,无法做强类型(主要用作智能感应,方便编写页面代码),不能作为参数传递,而ViewData可以
* 强类型视图:控制器方法的返回值直接作为
* Razor使用规范
* 单行:@C#代码;
* 多行:@{C#代码}
* C#代码与html标签混合,须使用@
* 当Razor和html有二义性时,使用()区分
* @@转义@
* html编码:Razor是html自动编码,是指C#字符串里的html代码若要输出html代码,可以使用@Html.Raw(""),即使用一个System.Web.IHtmlString对象实例
* javascript编码:@Ajax.JavaScriptEncode(ViewBag.Username) 代替 @ViewBag.Username避免js中注入攻击
* 服务器端注释 @* *@
* 模板布局视图:@RenderBody()——主体部分(引用该布局的视图在此位置),@RenderSection("Footer")节,多个重载,可设置可选节,引用视图中使用 @section Footer{<h1>内容</h1>}
* ViewStart:解决使用普通视图作为布局页引起的冗余问题,默认新建MVC项目会自动生成_ViewStart.cshtml文件,默认指定一个布局。。。详细待后续学习
* 部分视图PartialView
### Model模型
* 使用EF框架,代码优先
* 在Models文件夹下创建有关联的各个实体类
* 再添加控制器(选择带有EF框架的选项),选择模型,创建数据访问上下文类
### HTML辅助方法
### 注解和验证
### controller向view传递数据
* 1. Model
后台Action方法里
return View(object model);
前台使用
@model 类型 必须在第一行声明
@Modle.属性名
* 2. ViewBag
后台Action方法里
ViewBag.xxx="";
前台
@ViewBag.xxx
* 3. ViewData(现在不常用)
后台Action方法里
ViewData["Message"] = "Hello";
前台
@ViewData["Message"]
* 4. 参考
http://www.cnblogs.com/zyh-club/p/4941576.html
### view向controller传递数据
(前台传递的数据名称须和后台Action中的参数名称需要保证一致)
* 1.url传参
* 1.1 MVC路由机制
* 1.1.1 /控制器名/方法名/参数名=值
* 1.1.2 /控制器名/方法名/值 (一个参数时默认复制给参数,无需写参数名)
* 2. 表单Form(无返回值)
* 2.1 View页面的Form形式
* 2.1.1 传统Form表单
<form action="@Url.Action("AskForm")" method="post">
<input type="text" name="input1" value="默认值" />
<input type="text" name="input2" value="默认值" />
<input type="submit" value="提交"/>
</form>
* 2.1.2 MVC:HtmlHelper方法
* @Html.BeginForm()
@using (Html.BeginForm("Apply", "Star", FormMethod.Post, new {@class="MyForm"}))
{
<input type="text" name="input" value="默认值" />
@Html.TextBox("CARNO")
<input type="submit" value="提交"/>
}
* @Html.BeginRouteForm(),与上面类似
* 2.2 传递数据类型及实现方法
* 2.2.1 传递基本数据:前台html表单元素name属性值无规则,后台Action方法参数(name属性值1,...),或者后台Action方法里 string Username = Request["html表单元素name属性值"];
* 2.2.2 传递model(一个对象):前台html表单元素name属性值对应某类对象的属性
前台
@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
<td> @Html.TextBox("No") </td>
<td> @Html.TextBox("Name") </td>
<td> @Html.TextBox("Gender") </td>
<td> @Html.TextBox("Address") </td>
<td><input type="submit" value="提交" /></td>
}
后台
public class YYM
{
public string No { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public string Address { get; set; }
}
public ActionResult Index(YYM ca)
{
var d = ca.Name;
var s = ca.No;
return View();
}
* 2.2.3 传递集合:
* 传递基本类型集合(数组)
前台:html表单元素name属性值相同
后台:public ActionResult Index(List<string> html表单元素name属性值)
* 传递模型集合(暂时不会)
* 3. AJAX和Jquery(有返回值的,异步,网址不变)
* 3.1 View页面的AJAX形式
* 3.1.1 MVC:AjaxHelper方法
* 需要引入:
<script src="~/Scripts/jquery-1.8.0.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
* @Ajax.BeginForm()
@using (Ajax.BeginForm("Excute","Home",
new AjaxOptions
{
OnBegin = "return ValidateLog()提交前验证有返回值的js函数名"
UpdateTargetId="成功后更新的html元素ID",
OnSuccess = "con,回调js函数名(只写函数名)"
}))
{
@Html.TextBox("name")
@Html.TextBox("name")
<input type="submit" value="提交" />
}
<script>
function ValidateLog() {
if()*****
return false;
}
function con(data) {
alert(data);
}
</script>
* @Ajax.BeginRouteForm()
* @Ajax.ActionLink()
* 3.1.2 js函数提交:
function()
{
绑定要提交的data数据值
var data= ;
/*Jquery里AJAX的4种形式:如果提交的数据是js对象,须在data:使用JSON.stringify()将对象转为字符串*/
$.ajax({
type: "post",
contentType: 'application/json;charset=utf-8',
url: '/Resources/GetList.ashx',
data: 提交的数据,
success: function (data) {}
});
$.get("url",{提交的数据},function(data){});
$.post("url",{提交的数据},function(data){});
$.getJSON("url",{提交的数据},function(data){});
}
* 3.2 传递数据类型及实现方法
/*传递基本数据类型*/
前台js:
var obj = {
parm1: 100,
parm2: "我是string",
parm3: true,
parm4: 1.23,
parm5: 9.999999
};
后台Action方法参数(parm1,parm2...)
/*传递model(一个对象):数据对象obj的属性名对应某类对象的属性*/
前台js:
var obj = {
UserName: '张三',
UserPassWord: '不告诉你',
UserSex: '男',
UserPhone: '138888888888'
};
后台Action方法参数(UserInfo ca)
/*传递多个不同对象*/
前台js:
var userinfoObj = {
UserName: '张三',
UserPassWord: '不告诉你',
UserSex: '男',
UserPhone: '138888888888'
};
var addressObj = {
Country: '中国',
Province: '江西',
City: '南昌',
Street: '红谷滩新区XX路XX号'
};
Ajax函数里data参数:
data: JSON.stringify({
userinfo: userinfoObj,
address: addressObj
}),
后台Action方法参数(UserInfo userinfo, Address address)
/*传递对象集合*/
var model = [];
$.each($("table tr"), function (i, item) {
var RTONumber = $(item).find("[name=rtoNumber]").val();
var Approver = $(item).find("[name=approver]").val();
var Modifier = $(item).find("[name=modifier]").val();
var Comment = $(item).find("[name=comment]").val();
model.push({ rtoNumber: RTONumber, approver: Approver, modifier: Modifier, comment: Comment});
});
Ajax函数里data参数:data: JSON.stringify(model)
* 3.3 若有返回值,Controller实现
* return Json(返回的数据);//Json返回值类型System.Web.Mvc.JsonResult:System.Web.Mvc.ActionResult
* 4.参考
* http://www.cnblogs.com/sunxi/p/4484440.html
* http://www.cnblogs.com/BluceLee/p/3701283.html
* http://www.cnblogs.com/wubh/p/6253358.html
* http://blog.csdn.net/ydm19891101/article/details/44336951
* http://blog.csdn.net/hanxuemin12345/article/details/38872807
* http://blog.csdn.net/zjx86320/article/details/42555223
### ASP.NET常用类
* Page类
* ASP.NET页面生命周期(所有Web页面都继承自System.Web.UI.Page类)
* 1)客户机向Web应用程序发送一个页面请求
* 2)服务器端Web应用程序接收这个请求,先看这个页面是否编译过,若未编译就编译这个Web页面成一个类(该类继承自Page类),然后实例化该类产生一个Page对象
* 3)Page对象根据客户请求,把信息返回给IIS,然后信息由IIS返回给客户机(执行顺序:Page_Load()方法——(若有事件,执行事件对应的方法)——aspx页面上的服务器代码)
* 常用属性和方法
* IsPostBack(是否回传)if(!IsPostBack){}
* (Request,Response,Server,Session,Application,ViewState)获取当前Page实例
* MapPath(),ResolveUrl(),DataBind(),Dispose()
* Request类(获取发送请求端的各种信息)
* System.Web.HttpRequest类(注意区分HttpWebRequest,此类可以模拟客户机发送请求,功能完整强大)
* 常用属性和方法
* Browser(浏览器信息)
* Url
* Files(客户端上传的文件集合)
* Cookies(客户端发送的cookie集合)
* Form(form表单以POST方式提交的数据集合)
* QueryString(各种以GET方式提交的数据集合,包括以url地址?后的参数值)
* ServerVariables(各种信息集合)
* Request["参数名"]上述4种的集合,索引器
public string this[string key]
{
get
{
string str = this.QueryString[key];
if( str != null ) {
return str;
}
str = this.Form[key];
if( str != null ) {
return str;
}
HttpCookie cookie = this.Cookies[key];
if( cookie != null ) {
return cookie.Value;
}
str = this.ServerVariables[key];
if( str != null ) {
return str;
}
return null;
}
}
* Response类(Web服务器对客户机请求的响应),响应推送的内容在html文档之前
* System.Web.HttpResponse类(区分HttpWebResponse)
* 属性方法
* Cache等等...
* Redirect() 重定向到新的URL
* Write() 将信息写入HTTP响应输出流
* WriteFile() 将文件写入HTTP响应输出流
* 其他Clear(),Close(),Flush(),End()等等...
* Server类(与服务器相关的信息)
* System.Web.HttpServerUtility类
* 属性方法
* Execute() 执行指定虚拟路径的处理程序
* HtmlDecode() 对Html文本解码
* HtmlEncode() 对Html文本编码
* UrlDecode() 对(Url中的客户机发送的已编码字符串)进行解码
* UrlEncode() 编码字符串,以便通过Url从服务器通过HTTP可靠的发送到客户机
* Transfer() 终止当前页的执行,并为当前请求开始执行新页
* Cookie类(Cookies是服务器把少量数据存储到客户机,和从客户机读取数据的一种技术)
* System.Web.HttpCookie类
* 属性方法
* Session类(为每个用户的会话存储信息)
* ViewState类
### 基本服务器控件
* Html的文本标签实在客户机浏览器引发和处理的,而服务器控件(有runat="server"属性)则是在客户机引发,服务端处理的
* 文本
* Label
* Literral静态文本
* TextBox
* HyperLink超链接
* 按钮
* Button
* LinkButton超链接按钮
* ImageButton
* 图像
* Image
* ImageMap
* 选择
* CheckBox复选
* CheckBoxList复选列表
* RadioButton单选
* RadioButtonList单选列表
* 列表
* ListBox列表
* DropDownList下拉框列表
* BulletedList项目列表
* 容器控件
* Panel
* MultiView
* PlaceHolder
* 其他
* Calendar日历
* AdRotator动态广告
### 服务器验证控件
* RequiredFieldValidator必需项
* CompareValidator与某值比较
* RangeValidator范围检查
* RegularExpressionValidator模式匹配
* CustomValidator自定义方法验证
### 自定义服务器控件(.ascx)
### 数据绑定
* DataBind()方法:Page对象和所有Web控件成员的方法,DataBind()方法将所有子控件绑定到DataSource属性指定的数据源,父控件调用DataBind()方法时,所有子控件都会调用此方法,通常在Page_Load()方法里面调用Page对象的DataBind()方法,因为Page对象是页面上所有控件的父控件
* 简单绑定(可以在aspx页面上直接使用:此页面的类的字段,属性,方法,包含上述的表达式等)
* <%#字段名%> <%#属性名%> <%#方法名(参数)%>
* 在后台代码中给容纳数据的控件(DropDownList,DataGrid等)的DataSource属性绑定对应的数
### 数据表格服务器控件
* GridView
* DetailView 结合GridView显示表格单行的详细信息
* Repeater 模板分块化的表格控件,自由度高
/*<asp:Repeater>该控件的开始,所有项必须包含在内*/
/*<ItemTemplate>此项必须要有,用来包含表体绑定的数据<tr><td>内容</td></tr>*/
/*<HeaderTemplate>和<FooterTemplate>可以有,必须同时出现,<HeaderTemplate>用来放开头<table>和表头行<tr>,<FooterTemplate>用来放</table>*/
/*后台<asp:Repeater>的id.DataSource=取到的数据集*/
/*<%# Eval("字段名")%> 绑定列数据*/
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table>
<thead>
<tr>
<td>姓名</td>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("字段名") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody></table>
</FooterTemplate>
</asp:Repeater>
* DataList 类似Repeater,增加了选定项,编辑项,交替项等
* ListView 类似GridView,但可以使用类似Repeater的模板,高度自由化
* Chart(图表控件)新增
### 网站设计
* 母版页
* 网站导航
* 导航控件
* 主题
* 样式