① 用showModalDialog方式打开的aspx页面,如果点击后台Button的话,会打开一个新窗口。
原因是后台控件的Button相当于<input type="submit" />,提交表单。
解决方法:在<head>中添加<base target="_self" />
② .Net自带的Ajax.dll中的默认方式为同步,所以会出现等待画面卡住的问题,只要在方法后面添加上回调函数名即可变成异步调用
③ web.Config文件中 customErrors 的配置:
很多人都遇到过明明设置了customErrors 但不起作用的情况。 一般来说都是mode的设定不正确导致的。mode可选值有On|Off|RemoteOnly。默认值是RemoteOnly。 即仅向远程客户端显示自定义错误并且向本地主机显示 ASP.NET 错误。 所以当出错的时候,在开发人员看来是无效的(开发的时候一般都会把PC当服务器用) 解决方法:只需把mode设置为ON即可
④ 在ashx文件中使用Session
首先添加引用
using System.Web.SessionState;
实现接口
public class XXXX: IHttpHandler ==> public class XXXX: IHttpHandler, IRequiresSessionState
完成。
使用的时候需要通过HttpContext对象调用,如
public void ProcessRequest (HttpContext hc) { string code = hc.Session["Cold"].ToString(); }
⑤ 获取当前的Http请求对象:
var context = System.Web.HttpContext.Current context.Request.Params[...] context.Response.Write(...);
⑥ 获取发送Http请求的URL
HttpUtility.UrlEncode(Request.Url.AbsoluteUri))
⑦default的使用
default可用于多种场合,最多的是switch中,用于处理捕获不到的case。
还有一种场合就是泛型中设置初期值。
T initValue = default(T);
initValue存在两种可能的结果:引用类型的,如string,实体类等等,结果为null,其他的是0;
⑧ 双问号 ?? 的用法
在实际编码中经常会对一个数据进行空值判断,从而进行相应的赋值,如
Person p = result == null?(new Person()):result;
通过??可以使这个过程变得简单。如下面三种例子:
Person p = result ?? new Person();//如果result是null,则初始化而新的Person对象 int? i = GetValue(); i = i ?? 0;//如果i是null,则初始化为0 string str = result ?? "";//如果字符串为null,则变成空字符串
⑨ as 和 is 的用法
is的用处是判断对象是否是某种类型的(或者说如果强制转换成该类型对象的话是否能成功)
bool isPerson = new object { } is Person;
as的用处是将对象强制转换成某种类型的对象,即使失败也不会发生异常,而是返回null
string str = "X" as String;//返回X string str2 = new object { } as String;//返回null
⑩.反射的初级应用
1.根据类名获取类实例
string className = "Company.BigProgram.BLL.TestClass"; Type type = Type.GetType(className); if (type != null) { Object obj = Activator.CreateInstance(type); bool b = obj is TestClass; }
className是包含命名空间的类名
在这里只是根据类名创建了一个实例,但是没有将其转换为相应的实体类。所以一般情况 这里反射的类都应该有一个共同的接口(或者说有一个共同的父类);
这样就能很明确的创建和使用由反射得来的实体类了
//接口 namespace Company.BigProgram.BLL { public interface ITest { void say(string name); } }
//具体实现类 namespace Company.BigProgram.BLL { public class TestClass:ITest { public void say(string name) { Console.WriteLine("看这里"); } } }
//结果输出 string className = "ImageTest.TestClass"; Type type = Type.GetType(className); if (type != null) { ITest obj = Activator.CreateInstance(type) as ITest; bool b = obj is TestClass; MessageBox.Show(b.ToString());//True }
2.根据实例和其属性名(字符串) 获取该属性
/// <summary> /// 获取某个对象的某个属性值 /// </summary> /// <param name="type">对象</param> /// <param name="propName">属性名</param> /// <returns>属性值</returns> private string GetPropertyValue<T>(T item, string propName) { Type type = item.GetType();//获取类型 System.Reflection.PropertyInfo propertyInfo = type.GetProperty(propName); return (propertyInfo.GetValue(item, null) ?? "").ToString(); }
3.根据实例和其方法名(字符串)获取该方法并调用
private void GetPropertyValue<T>(T item, string name,object[] paras) { System.Type type = item.GetType();//获取类型 System.Reflection.MethodInfo func = type.GetMethod(name);//获取方法 func.Invoke(item, paras);//调用 item是调用该方法的对象,paras是参数 } private class Person { public void say() { MessageBox.Show("XXXXOOOO"); } public void call(string content) { MessageBox.Show(content); } }
11.给类添加扩展方法
public class Person { public Person(string name) { this.Name = name; } public string Name { set; get; } } public static class PersonExtension { public static string Sing(this Person p, string song) { return String.Format("{0} is sing the song:{1}", p.Name, song); } } Console.WriteLine(new Person("Ray").Sing("My Love")); ==> Ray is sing the song:My Love
重点在PersonExtension类。这必须是个静态类,要扩展的方法也必须是静态方法
第一个参数的类型代表着要扩展的类。“this”也是必须的
12. 给函数定义多个形参
有的时候函数需要有多个参数,但是个数在编译时是不知道的。
解决方式:
public void ConcatObjects(params object[] objs) { } ///使用 public void Main() { ConcatObjects("A",2,false); }
13.using的用法
①引入命名空间 如
using Company.Project.Common;
②在代码块结束时自动释放资源 如
using(MemoryStream s = new MemoryStream()) { //TO DO }