存档

‘ASP.NET’ 分类的存档

推荐VS2008插件CodeRush Xpress for C#

2009年11月25日
783 views 1 条评论

前段时间DevExpress和微软共同发布了CodeRush Xpress for C#,它包含了Code RushRefactor! Pro中的一些特性。这些特性包括增强的导航、选择工具、代码创建功能以及强大的重构能力。另外CodeRush Xpress还对C#中既有的重构功能做了封装,这些功能用起来更为方便了。不过它不支持Express版的Visual Studio。

CodeRush Xpress的强点包括易于访问的重构和代码创建功能、强大的文件和代码导航功能、一组编辑器、选择、剪贴板工具等。

下面简单介绍一下几个功能。

1. 使用中生成(Generate From Usage)

本来C#中有一个生成方法的功能,如果来类中调用了一个未声明的方法,VS会提示是否生成该方法,不过CodeRushX的功能要强大得多。除了方法,它还支持构造函数、类、委托、枚举、事件处理器、字段、属性、接口、局部变量、结构等。

来看看生成类时的情况。在下面的代码引用了未声明的类TestClass,此时可选择声明类(或结构、枚举)

生成结果为:

TestClass类的框架生成好了,并按照调用者的代码添加了相应的构造函数。右下角的提示框是CodeRushX的一大特色,它根据当前使用的功能提供相应的提示。

等一下,有了这样的功能,我们写代码的顺序是不是可以跟以前不一样了?我们可以先编写使用一个类的代码,然后利用CodeRushX生成该类,这有些像TDD的方式,所以这个特性成为TDD风格的使用中生成

2. 文件导航功能

CodeRushX支持快速文件导航,使用快捷键Ctrl+Alt+F,可以打开快速文件导航窗口:

这个功能DPack也有,不过看看这个更奇妙的:

我们只要输入单词的首字母就可以进行过滤,当然这里需要大写字母。

3. 代码导航功能

对于代码导航,CodeRushX提供了一个快速导航窗口,快捷键为Ctrl+Shift+Q:

默认地,它会列出所有的成员。CodeRushX为此也提供了文本过滤功能:

比如我们可以选择只显示当前文件,这里也支持类似于文件导航的缩略词过滤。

4. 代码编辑

先看看复制行(Duplicate Line)功能。我们经常要在类的开头定义多个字段,或在方法开头定义多个变量,它们的类型可能是一样的,此时复制行就派上用场了。

这里要连续定义firstName和lastName,先写出firstName这一行,然后按Shift+Enter,就会生成新的行,并选中了字段名,可以直接进行编辑。

除了这里提到的字段,复制行还支持方法、事件、属性、using语句、赋值语句等。程序员最怕重复性的工作,CodeRushX可以帮我们的大忙。

高亮所有引用

在NetBeans中见过这样的功能,即高亮标识符所有的引用。

现在CodeRushX提供了类似的功能,虽然没有这么酷,快捷键是Ctrl+Alt+U:

5. 递增/递减选择文本(Increase Reduce Selection)

这个功能很有用。代码中会有命名空间、类、方法、方法体,通过快捷键我们就可以递增地选择方法体、方法直到当前文件的所有代码,快捷键为Ctrl+Alt+=,也可以按Ctrl+Alt+-按原路返回。

6. 重构

CodeRushX提供了多达25种重构特性,它们是:

  • 增加块分隔符
  • 组合条件
  • 压缩为Lambda表达式
  • 压缩为Ternary表达式
  • 转化为自动实现的属性
  • 转化为Initializer
  • 创建存储备份
  • 分解Initializer
  • 分解参数
  • 扩展Lambda表达式
  • 扩展Ternary表达式
  • 抽取方法
  • 压缩条件
  • 内联代理
  • 内联Temp
  • 引入Local
  • 显示
  • 隐藏
  • 将类型转到文件中
  • 命名匿名方法
  • 命名匿名类型
  • 翻转条件
  • 分割条件
  • 使用String.Format
  • 使用StringBuilder

要使用这些重构特性,可以使用右键菜单或者快捷键Ctrl+`:

7. 可视化元素

CodeRushX的一大特色是提供了大量直观、动感的提示信息,比如:

Action Hints ->

Big Hints ->

Smart Tags ->

Shortcuts ->

当然,上面介绍的这些只是它的部分功能而已,如果你感兴趣,就尝试一下吧,肯定会有惊喜的。用了CodeRush Xpress,才体会到”工欲善其事,必先利其器”,它无疑会大大改善我们的开发体验,再次强烈推荐。

转自:
http://hi.baidu.com/%CE%E5%C1%B8%D2%BA%BD%BD%BB%A8/blog/item/f37b622a8ebba82ad52af109.html

ASP.NET, 开发工具

安装VS2010后,更改iis的asp.net版本

2009年7月16日
1,451 views 没有评论

今天安装了一个vs2010来更新一下程序,发现一个奇怪的问题.asp.net的版本不能更改了.出现以下提示:
—————————
Confirm
—————————
Changing the Framework version requires a restart of the W3SVC service. Alternatively, you can change the Framework version without restarting the W3SVC service by running: aspnet_regiis.exe -norestart -s IIS-Viirtual-Path
Do you want to continue (this will change the Framework version and restart the W3SVC service)?
—————————
是(Y) 否(N)
—————————

解决办法如下:
我的项目原本就是v2.0的,按照提示直接在命行执行以下命令,
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -norestart -s W3SVC/1/ROOT/HrInfo
——————————–
开始在 W3SVC/1/ROOT/HrInfo 递归注册 ASP.NET 脚本映射(2.0.50727)。
已在 W3SVC/1/ROOT/HrInfo 递归注册了 ASP.NET 脚本映射 (2.0.50727)。

HrInfo 表示您的项目名称.

ASP.NET, Microsoft产品, 开发工具

系统发送带图片的邮件(.NET版)

2009年4月2日
704 views 没有评论

有时候需要系统发一些带图片的邮件给用户,一般的做法是将邮件中的图版放到公网上,然后在HTML邮件中指定绝对地址.但这样做有一些bug,就是outlook2003等其他一些客户端会禁止你看这些图片.
现在最好的做法是将图版放在邮件中,发送一个带图的HTML邮件给客户.
下面是 .NET 发邮件中的关键代码.

1
2
3
4
5
6
7
string fileName = System.IO.Directory.GetCurrentDirectory().ToString() + "\\PA.JPG";
LinkedResource lrImage = new LinkedResource(fileName, "image/jpeg");
icontent = icontent.Replace("[attid]", lrImage.ContentId);
 
AlternateView htmlBody = AlternateView.CreateAlternateViewFromString(icontent, null, "text/html");
htmlBody.LinkedResources.Add(lrImage);
em.AlternateViews.Add(htmlBody);

完整程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Mail;
 
namespace cutEmpAccount
{
    class EmailSimple
    {
        private static string _content = @"<p>系统维护人员:<br />
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src='cid:[attid]' />
			取消帐号出错,请跟进。</p>";
 
        public static void sentEmail(string empId, string name, string deptCode, string deptName)
        {
            SmtpClient smtp = new SmtpClient();
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtp.EnableSsl = false;
 
            smtp.Host = "smtp.extjs.org.cn";
            smtp.Port = 25;
 
            smtp.UseDefaultCredentials = true;
            smtp.Credentials = new NetworkCredential("fatjames", "fatjames");
 
            MailMessage em = new MailMessage();
            em.Subject = "停帐号出错通知";
            em.SubjectEncoding = Encoding.GetEncoding(936);
 
            em.From = new MailAddress("fatjames@extjs.org.cn", "停帐号系统",Encoding.GetEncoding(936));
            em.To.Add(System.Configuration.ConfigurationSettings.AppSettings["ErrEmail"]);
 
            em.IsBodyHtml = true;
            em.BodyEncoding = Encoding.GetEncoding(936);
 
string fileName = System.IO.Directory.GetCurrentDirectory().ToString() + "\\PA.JPG";
LinkedResource lrImage = new LinkedResource(fileName, "image/jpeg");
icontent = icontent.Replace("[attid]", lrImage.ContentId);
 
AlternateView htmlBody = AlternateView.CreateAlternateViewFromString(icontent, null, "text/html");
htmlBody.LinkedResources.Add(lrImage);
em.AlternateViews.Add(htmlBody);
 
            smtp.Send(em);
 
        }
    }
}

ASP.NET ,

配置 WCF – 解决 “HTTP Error 404.3 – Not Found”

2009年3月26日
2,187 views 没有评论

    今天跟同事Micheal跟进一个项目的时候发现了一个问题,在Micheal上可以正常使用的WCF程序到了我的机上就不能运行了.出错信息如下:

应用程序“DEFAULT WEB SITE/COISWEB”中的服务器错误

 

HTTP 错误 404.0 – Not Found
您要找的资源已被删除、已更名或暂时不可用。

 

解决方案:

来自 Michael Washington

1) Select "run" from the Start menu

2) Enter "cmd" and click OK

3) enter "cd c:\windows\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\" and press Enter.

4) Enter "ServiceModelReg -i" and press Enter.

5) WCF will now be installed:

原文:http://iweb.adefwebserver.com/Project/Blog/tabid/57/EntryID/34/Default.aspx

ASP.NET , ,

隐式类型的局部变量

2009年2月4日
675 views 没有评论

可以赋予局部变量推断“类型”var 而不是显式类型。var 关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型或 .NET Framework 类库中定义的类型。

下面的示例演示了使用 var 声明局部变量的各种方式:

// i is compiled as an int
var i = 5;
 
// s is compiled as a string
var s = "Hello";
 
// a is compiled as int[]
var a = new[] { 0, 1, 2 };
 
// expr is compiled as IEnumerable
// or perhaps IQueryable
var expr =
    from c in customers
    where c.City == "London"
    select c;
 
// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };
 
// list is compiled as List
var list = new List();

需要了解的一点是,var 关键字并不意味着“变体”,也不表示该变量是松散类型化变量或后期绑定变量。它只是表示由编译器确定和分配最适当的类型。

var 关键字可在下面的上下文中使用:

在如上示例所示的局部变量(在方法范围中声明的变量)上。

在 for 初始化语句中。

for(var x = 1; x &lt; 10; x++)

在 foreach 初始化语句中。

foreach(var item in list){...}

在 using 语句中

using (var file = new StreamReader("C:\\myfile.txt")) {...}

有关更多信息,请参见如何:在查询表达式中使用隐式类型的局部变量和数组(C# 编程指南)。

var 和匿名类型
在很多情况下,var 是可选的,它只是提供了语法上的便利。但是,在使用匿名类型初始化变量时,如果需要在以后访问对象的属性,则必须将该变量声明为 var。这在 LINQ 查询表达式中很常见。有关更多信息,请参见匿名类型(C# 编程指南)。

从源代码的角度来说,匿名类型没有名称。因此,如果已使用 var 初始化查询变量,则只有一种方法可以访问返回的对象序列中的属性,那就是使用 var 作为 foreach 语句中的迭代变量的类型。

class ImplicitlyTypedLocals2
{
    static void Main()
    {
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };
 
        // If a query produces a sequence of anonymous types,
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };
 
        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry
 */

备注
下列限制适用于隐式类型的变量声明:

只有在同一语句中声明和初始化局部变量时,才能使用 var;不能将该变量初始化为 null、方法组或匿名函数。

不能将 var 用于类范围的域。

由 var 声明的变量不能用在初始化表达式中。换句话说,表达式 int i = (i = 20) 是合法的;但表达式 var i = (i = 20) 则会产生编译时错误。

不能在同一语句中初始化多个隐式类型的变量。

如果范围中有一个名为 var 的类型,则 var 关键字将解析为该类型名称,而不作为隐式类型局部变量声明的一部分进行处理。

在查询表达式中,当难以确定查询变量的确切构造类型时,您会发现 var 也很有用。这种情况可能发生在分组和排序操作中。

当在键盘上键入变量的具体类型单调乏味时,或者当该类型显而易见或对提高代码可读性没有作用时,var 关键字也可能有用。var 以这种方式发挥作用的一个示例是嵌套的泛型类型,例如在分组操作中使用的那些类型。在下面的查询中,查询变量的类型是 IEnumerable>。只要您和其他必须维护您代码的人员了解到这一点,就可以毫无问题地使用隐式类型化,以达到方便和简洁的效果。

// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable&gt;
 var studentQuery3 =
     from student in students
     group student by student.Last;

不过,使用 var 确实可能使其他开发人员更加难以理解您的代码。因此,C# 文档通常仅在需要时才使用 var。

ASP.NET ,

泛型的优点

2009年2月4日
619 views 没有评论

在公共语言运行时和 C# 语言的早期版本中,通用化是通过在类型与通用基类型 Object 之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案。通过创建泛型类,您可以创建一个在编译时类型安全的集合。

使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序利用 .NET Framework 类库中的 ArrayList 集合类。ArrayList 是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。

1
2
3
4
5
6
7
8
// The .NET Framework 1.1 way to create a list:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);
 
System.Collections.ArrayList list2 = new System.Collections.ArrayList();
list2.Add("It is raining in Redmond.");
list2.Add("It is snowing in the mountains.");

但这种方便是需要付出代价的。添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。

另一个限制是缺少编译时类型检查;因为 ArrayList 会将所有项都强制转换为 Object,所以在编译时无法防止客户端代码执行类似如下的操作:

1
2
3
4
5
6
7
8
9
10
11
12
System.Collections.ArrayList list = new System.Collections.ArrayList();
// Add an integer to the list.
list.Add(3);
// Add a string to the list. This will compile, but may cause an error later.
list.Add("It is raining in Redmond.");
 
int t = 0;
// This causes an InvalidCastException to be returned.
foreach (int x in list)
{
    t += x;
}

尽管将字符串和 ints 组合在一个 ArrayList 中的做法在创建异类集合时是完全可接受的,并且有时需要有意为之,但这种做法很可能产生编程错误,并且直到运行时才能检测到此错误。

在 C# 语言的 1.0 和 1.1 版本中,只能通过编写自己的特定于类型的集合来避免 .NET Framework 基类库集合类中的通用代码的危险。当然,由于此类不可对多个数据类型重用,因此将丧失通用化的优点,并且您必须对要存储的每个类型重新编写该类。

ArrayList 和其他相似类真正需要的是:客户端代码基于每个实例指定这些类要使用的具体数据类型的方式。这样将不再需要向上强制转换为 T:System.Object,同时,也使得编译器可以进行类型检查。换句话说,ArrayList 需要一个类型参数。这正是泛型所能提供的。在 N:System.Collections.Generic 命名空间的泛型 List<(Of <(T>)>) 集合中,向集合添加项的操作类似于以下形式:

1
2
3
4
5
6
7
8
// The .NET Framework 2.0 way to create a list
List&lt;int&gt; list1 = new List&lt;int&gt;();
 
// No boxing, no casting:
list1.Add(3);
 
// Compile-time error:
// list1.Add("It is raining in Redmond.");

对于客户端代码,与 ArrayList 相比,使用 List<(Of <(T>)>) 时添加的唯一语法是声明和实例化中的类型参数。虽然这种方式稍微增加了编码的复杂性,但好处是您可以创建一个比 ArrayList 更安全并且速度更快的列表,对于列表项是值类型的情况尤为如此。

ASP.NET , , ,

检测到在集成的托管管道模式下不适用的 ASP.NET 设置

2009年1月19日
3,160 views 没有评论

    最近由于项目比较紧张,过年了,很多外地的同事都请假提前回家了.没办法,进度还是要按时完成的.只能硬着头皮自己也参与到项目的代码编写当中来了.

    这个项目是香港集团的一个应用系统,以前一直在win2000服务器下运行,基本上没有什么错误.最近要加一个新的需求,顺便也把.net framework 从1.1升级到2.0. 在同事的winxp下面,也一点问题也没有.可是搬到我的机器上,就出问题了,错误信息如下:

HTTP 错误 500.23 – Internal Server Error
检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

   这个一个问题其实是由于我的系统是 Vista , IIS7的缘故.一般的解决办法是选择应用程序池为经典应用程序池.如下图所示:
2009-01-19_160305

ASP.NET , ,

{由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值}

2009年1月17日
2,313 views 1 条评论

    今天在家闲着无事,想找个时间补一下.net方面的基础知识.于是乎打了很久之前的一个小小的测试项目,编译项目成功.但是运行的时候居然报错.该项目前一阵子还在我公司的电脑上测试通过的.

出错代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
            try
            {
                Response.Cookies["userId"].Value = u.userId.ToString();
                Response.Cookies["username"].Value = u.username;
 
                Response.Redirect("Default.aspx");
                Response.End();
            }
            catch (Exception ex)
            {
                throw ex;
            }

没办法,只有上去百度一下,发现还真有这个问题的解决方案.

如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常。您可以使用 try-catch 语句捕获此异常。
Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面的代码行。
此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用 Response.End。
解决方案 :
要解决此问题,请使用下列方法之一:
• 对于 Response.End,调用 HttpContext.Current.ApplicationInstance.CompleteRequest 方法而不是 Response.End 以跳过 Application_EndRequest 事件的代码执行。
• 对于 Response.Redirect,请使用重载 Response.Redirect(String url, bool endResponse),该重载对 endResponse 参数传递 false 以取消对 Response.End 的内部调用。例如:
Response.Redirect (“Default.aspx”, false);

原文地址:http://www.cnblogs.com/zhangronghua/archive/2008/09/11/1289089.html

ASP.NET , ,

asp.net连接mysql字符校对不匹配

2008年12月27日
930 views 没有评论

今天升级了一个原来由Visual Studio 2002开发的一个asp.net+mysql项目,升级到.net framework 2.0后,编译没有任何错误,但居然不能运行了,提示信息如下:

Illegal mix of collations (latin1_swedish_ci,IMPLICIT), (gb2312_chinese_ci,COERCIBLE), (gb2312_chinese_ci,COERCIBLE)

解决办法如下:
1,修改数据库/表/字段的编码.
2,执行之前加上set names latin1;
3,更改my.ini的init-connect=” latin1″(没有则加上).
4,查询时加上强制字符编码转换
   select * from table where name = ‘xxx’ COLLATE latin1_swedish_ci

ASP.NET, DataBase

aspx文件编码不统一导致乱码

2008年12月12日
2,180 views 1 条评论

今天在将一个旧的MIS系统升级到VS2008时,发现了一个很奇怪的现象,有些页面乱码,而有些則不会.
所有页面在VS2008下面都是可以正常显示的,一点问题也没有.

上网查找了很多方法均不能解决,根据以前开始asp,php的经验,怀疑这些页面的编码可能不一样.在VS2008下面还真的不知道在哪里看文件的编码,没有办法,只好安装了一个Dreamweaver CS3来暂时用一下.打开一个乱码跟一个不乱码的页面对比了一下,发现一个是gb2312(不乱码),而别外一个则是utf-8(不乱码).在Dreamweaver (修改->页面属性->编码)改为gb2312后,所有页面均正常显示了.

这可能是VS2008的一个bug,也可能跟我安装的vista有关系.

ASP.NET , ,

升级.net framework v1.0 to 2.0

2008年12月2日
1,282 views 没有评论

今天升级一个旧的程序从v1.0到2.0,更新到服务器上的时候居然出错了.出错信息如下:

类型“web.Global”不明确: 它可能来自程序集“D:\web\TMS\bin\TMS.web.DLL”或程序集“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\tms\6b0a4f65\596fddb8\App_Code.jhi2gqkh.DLL”。请在类型名称中显式指定程序集。

该程序在本机及测试环境都非常正常,所以排除是程序本身的问题,应该是跟服务器环境有关.

由于是覆盖式更新,原来bin目录下面的dll文件并没有被删除.该项目的在v1.0下面的编译文件TMS.dll并没有被删除,把该文件删除后,一切正常.

ASP.NET , , ,