ASP.NET MVC RC2 已发布

ASP.NET MVC 的团队发布了 ASP.NET MVC 新版本,令人期待的并不是正式版,而是继续是正式版的候选版本 RC2。

您可以从以下地址进入到微软下载中心下载新版本:

http://www.microsoft.com/downloads/details.aspx?FamilyID=ee4b2e97-8a72-449a-82d2-2f720d421031&displaylang=en

以下是 Haacked 发布的对新版本的说明:

【原文地址】http://haacked.com/archive/2009/03/03/aspnetmvc-changes-for-rc2.aspx

Read More →

asp.net出错无法查看,百度提示误工!

可恶的百度,又深深地让我恶心了一把,NND,调试个程序,不能查看错误原因,爷爷的,在FIREFOX下正常,证明是IE的问题,肯定是装了百度的什么插件,控制面版里面又没有,我也从来不装这类插件,不知什么时候潜入我的电脑的,不爽!!!

下载了一个360搞定!

Read More →

ASP.NET页面状态管理——ViewState的使用

ASP.NET ViewState设计目的是为了持久化当前页面中的对象的状态,以便下次在页面回发(Postback)后能够还原页面的状态。那么有两点需要注意:

  1. ViewState只在需要Postback的页面里才需要使用;
  2. 在1前提之下,只有初始状态值被修改了的对象才需要持久化,即才需要使用ViewState。

第1点比较清楚,来谈第2点。以简单的Label控件为例,先来看一下它的Text属性的实现:

public virtual string Text
{
    get
    {
        object obj2 = this.ViewState["Text"];
        if (obj2 != null)
        {
            return (string) obj2;
        }
        return string.Empty;
    }
    set
    {
        if (this.HasControls())
        {
            this.Controls.Clear();
        }
        this.ViewState["Text"] = value;
    }
}

很显然Text属性的后端都是以ViewState为存储介质的,ASP.NET服务器端控件的很多属性都是以类似方式实现的。假设一个页 面default.aspx里只有一个Label控件, <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>,当访问该页面时,Label控件发送到客户端浏览器的代码大概为 <span id="xxx_Label1">Label</span>,同时ViewState中也保存了一份Text属性的值,形式大概为<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTgwMzg2ODMxMQ9kFgJmD2QWAgIDD2QWAg......

到目前位 置,ViewState并没有发挥作用(这里谈论的都是在ViewState Enable的情况下),额外的保存了Text属性的值在这里是多余的。假设该页面还有一个Button控件,点击该按钮页面回发,那么在次过程中 ViewState就发挥作用了么?分析一下该页面回发过程中Label控件生命周期的某些过程。首先,回发后,Label控件依然要经历初始化阶段 (Init),这个阶段要创建一个Label控件的实例,同时设置其Text属性的,因为Text属性后端是以ViewState为存储介质的,所以就相当于向ViewState里添加了一个值,接下来,因为是回发过程,所以控件还要LoadViewState,即加载前次访问该控件的状态值,下面是Label控件的实现:

protected override void LoadViewState(object savedState)
{
    if (savedState != null)
    {
        base.LoadViewState(savedState);
        string text = (string) this.ViewState["Text"];
        if (text != null)
        {
            this.Text = text;
        }
    }
}

因为在前一访问过程中ViewState中所保存的Label的Text属性的状态值 就是Label的初始值,所以导致了这里的LoadViewSate过程是多余的了,而且Init和LoadViewState两个过程对Text属性都 赋了相同的值。由此可见,即使在页面回发中,如果不需要对属性的初始值进行修改,那么持久化属性的值(即使用ViewState)也是没有意义的。而且会 带来多余的资源浪费,如两次对Text属性的赋值,以及增加了ViewSate的体积所带来的多余的网络传输。

那么,什么情况下使用ViewSate是值得的呢?我们先来把前面例子中两次访问的过程理一下:

  1. 第一次访问页面,Label控件初始化,设置Text属性的值,即向ViewState中添加了一个条目;
  2. 页面发送前(Render前),控件SaveViewState,即ViewSate中的值序列化,保存到一个隐藏域中;
  3. 页面发送,Label控件发送为相应的HTML标签,读取Text属性设置HTML标签的对象属性值,同时发送隐藏域及其值。对于Labe的Text属性来讲,相当于一份ViewState中的值发送了两份客户端拷贝;
  4. 第二次回发访问,Label控件初始化,设置Text属性的值,即向ViewState中添加了一个条目;
  5. 由于是回发访问,需经历LoadViewState过程,本例中即读取ViewState中Text属性在上一次访问中的状态值,而这个值实际上等于过程1中设置的值,读取的值再次设置Text属性,
  6. 第二次发送,重复过程2,3.

从过程1控件初始化,到过程6,第二次发送前SaveViewState,在这两个过程中间,如果不需改变Text属性的初始值,那么实际上就不需要使用ViewState。假设我们在过程1、2中间改变Text属性值,如在Page_Load中如此:

protected void Page_Loadt(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Label1.Text = "Change Label′s value";
    }
}

 那么,尽管在回发时不能执行Label1.Text = "Change Label´s value";语句,但由于ViewState的作用,第一次访问设置的值,在第二次回发访问后仍然会存在,即Label的Text属性值为 ”Change Label´s value“,而不是其初始值“Label”。这种情况下才是ViewState的用武之地。注意!IsPostBack的使用,否则你只是每次访问都进 行赋值而已,并没有利用ViewState的好处。

由此,可以得出,在满足前面所述的两个条件时才应该使用ViewState。那么在现实应用中同时满足以上两个条件的情况下多么,也就是说我们需要使用ViewSate的时候多么?

很显然,满足这两个条件最大宗的情况就是数据绑定。而我认为ViewState的设计目的主要就是为了将必要的信息持久化在页面中,避免在 两次访问中(确切的说不只两次,而是所有的回发访问中)都要进行数据绑定(而每次数据绑定往往意味着一次次的数据库访问)。例如用GridView绑定 DataSource控件展现一个类表数据,在ViewSate Enable的情况下,页面第一次加载时进行数据绑定,在随后的回发访问中,如果仍是访问当前数据视图,即没有进行分页、排序操作 等,DataSource不会再进行数据绑定,因为所有的信息都可以从ViewSate中获取,不需要再次访问数据库再次绑定数据控件了。而如果你将 ViewState Disable掉,那么每次访问则都需要进行数据绑定了(可以通过SqlProfiler来捕捉SqlDataSource在两种情况下对数据库的访问情 况)。这个场景可能最能说明ViewSate的设计初衷了。

然而在实际的应用中,上面的这种场景多么?在数据列表页面,往往没有除了分页排序等之外的回发操作(你放Grid的页面里有回发的按钮 么?),而分页,排序操作所引起的回发显然是需要数据再绑定的。如果是这种场景,那么你就应该把这个页面或者把这个Grid的EnableView属性设 为false了。这里讲点题外话,有人会说如果设成false,那Grid的分页信息、排序信息怎么传递给后续的回发访问呢?其实在ASP.NET 2.0中控件的状态管理被分为了两部分view state和control state。两者的区别是什么呢,那ASP.NET 1.x中的DataGrid控件来说,DataGrid的所有状态信息都保存在view state当中,但是这些信息所符合的view state应用场景是矛盾的,比如你的页面没有回发操作,你不必把所有数据缓存到view state里,这时你会把datagrid的enableviewstate属性设为false,但当你这么做后,datagrid的另一些功能如翻页、 排序,就没法使用了,因为翻页排序的状态信息也是保存在view state中的,如pageindex、sort asc/desc等。就类似于这种问题,ASP.NET 2.0中又引入了control state,control state的存储方式与view state相同,不同的地方在于它不会被disable掉。这样control state用来存储那些控件的功能性的,必需的信息。比如即使GridView的view state被禁止了,它的分页,排序等信息还是仍然正常工作的。

ASP.NET的一些设计,如整个页面一个form元素,以及本文谈到的view state的使用等,只是在宏观上,概率统计上能达到节约成本,提高效率的目的。但是具体到一个Web程序, 一个应用场景,一个页面,甚至是一个控件,如果你知到它们背后的东西,你就会更好更正确的去实现它或使用它。

Read More →

ASP.NET图片防盗链的方法

考试了,应该复习了,书看不进去哇~~~

空闲的时候想想自己的感兴趣的事情,想啊想就看到将要开始的一个项目,想到关于图片防盗的问题,这个东东,我觉得不是很难,大多数的网站都已经实现了,估计是在httpHandlers中实现的。

GOOGLE了一下,果然,代码很简单,原理我就不讲了,网上很多

在web.config的<system.web>配置节中加下如下代码

<httpHandlers>
      <add verb="*" path="*.jpg" type="ASPX2.jpg2, ASPX2"/>
</httpHandlers>

Read More →

Understanding Page Inheritance in ASP.NET 2.0

以前没有认真想过ASP.NET的页面模型到底是什么样的,光做简单的开发,没什么太大的意思,现在想深入研究一下,嘿嘿,档次不一样了吧。。。

我一直存在这样的疑问:

在ASP.NET中,Default2.aspx和Default2.aspx .cs是不是两个类?如果是的话,在这里我也称之为前台类和后台类

Default2.aspx .cs中,代码是这样的:

public partial class Default2 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
 
    } 
}

Default2有partial 修饰,是不是说前台类和后台类是不是都是partial类?编译的时候会合成?

在Default2.aspx中,有这样的代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

是不是说前台类和后台类是继承的关系?

总结陈词:这两个既是partial 类,又是继承的关系?

想到这里,其实非常可笑,partial 类怎么能可能出现继承关系呢?partial 意味着类名是相同的,如何可能继承:

public partial class test :test
{
	public string s1 = "jm1";
	public void print()
	{
		Console.WriteLine(base.s1);
	}
}
public partial class test
{
	public string s2 = "test2";
}

这种情况编译都能不过,开玩笑~~~

关键时候还是MS的帮助文档管用,可以看看这两篇文章:

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/81b13e7a-b95b-4285-906f-d2dd77411417.htm

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/01e87387-33f4-45b5-91ec-6c540afe7ee0.htm

还有一篇文章推荐一下:http://www.west-wind.com/WebLog/posts/3016.aspx,有例子,可以用.NET Reflector查看相关代码

Read More →

ASP.NET 2.0中CSS失效解决方案

经常有人遇到ASP.NET 2.0(ASP.NET 1.x中可能是有效的)中CSS失效的问题,现将主要原因和解决方法罗列如下:

1、CSS文件路径不正确

这个问题属于Web开发中的基础问题,一般采用相对路径会出现这样的问题,或者样式文件写在了模板页里面,在内容页与模板页不在同一级目录下 时会出现这样的问题。此时你要清楚Web中相对路径的规则,如果你不清楚,可以采用绝对路径的写法试试就知道是不是路径的问题了。

2、CSS规则写法错误

这个问题谁也帮不你,只能自己学习CSS的相关知识了。

3、文件编码问题

Read More →

asp.net2.0导出pdf文件完美解决方案

关键是itextsharp.dll和ICSharpCode.SharpZipLib.dll两个文件

关键性代码: 

Document document = new Document();
PdfWriter.GetInstance(document, new FileStream(Server.MapPath("example.pdf"), FileMode.Create));
document.Open();
BaseFont bfChinese = 
    BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL, new Color(0, 0, 0));
document.Add(new Paragraph(this.TextBox1.Text.ToString(), fontChinese));
iTextSharp.text.Image jpeg = iTextSharp.text.Image.GetInstance(Server.MapPath("1.jpg"));
document.Add(jpeg);
PdfPTable table = new PdfPTable(datatable.Columns.Count);
for (int i = 0; i < datatable.Rows.Count; i++)
{
    for (int j = 0; j < datatable.Columns.Count; j++)
    {
        table.AddCell(new Phrase(datatable.Rows[i][j].ToString(), fontChinese));
    }
}
document.Add(table);
document.Close();

Read More →

当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限

当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限。说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Web.HttpException: 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限解决方法:

运行:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -i -enable

系统会显示正在安装.net。稍后一切恢复正常。

Read More →

关于asp.net Session丢失问题的总结

asp中Session的工作原理:

asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

asp.net Session的实现

asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。

原因1:

bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写

Read More →
Card image cap

ASP.NET MVC Preview 3 发布

ASP.NET MVC Preview 3已经发布,最新版本在ASP.NET 3.5运行时上提供了一个新的模型视图控制器(MVC)框架.这意味着开发者可以利用MVC方式设计各种Web应用.
新的 ASP.NET MVC 框架选项非常干净,而且容易使用.它将允许你在你的应用中很轻易地保持关注分离,而且有助于进行干净的测试和TDD.

下载:ASP.NET MVC Preview 3 

不了解什么是MVC,看这篇文章:http://www.minsblog.com/Notes/Article-534.html

Read More →

在ASP.NET中发邮件!

using System.Net.Mail; 

MailMessage mm = new MailMessage(emailfrom.Text, emailto.Text);

mm.Subject = subject.Text;
mm.Body = body.Text;
mm.IsBodyHtml = true;

SmtpClient sc = new SmtpClient();
sc.Send(mm);

上面是核心代码,在web.config里面须配置:

<system.net> 
<mailsettings>
<smtp> <network host="smtp.qq.com" port="25" username="******@qq.com" password="****"></network> </smtp>
</mailsettings>
</system.net>

Read More →

关于ASP.NET中Request.QueryString的乱码问题

  今天在使用Request.QueryString的时候,发现所有接收到的字符串,只要是带中文的都会变成乱码。后来经过研究,终于找到了原因。

  ASP.NET默认使用的都是UTF-8编码,而大家一般使用的都是GB2312编码。这就是Request.QueryString时中文变成乱码的原因所在,也因为这样,才为大家带来了很多麻烦。

  下面我们来看两个参数:“test.aspx?string=%b7%e7%a4%ce%ca%c0%bd%e7”和“test.aspx?string=%e9%a3%8e%e3%81%ae%e4%b8%96%e7%95%8c ”。粗略一看,这是给test.aspx页面传递了两个不一样的参数,可是经过正确的URL反编码后,可以发现这两个其实是同一个参数:风の世界!为什么同一个参数会得到两个不一样的字符串呢?这是因为第一个参数是用GB2312的U

Read More →

ASP.NET程序员:轻松一点,胜人一筹

学习ASP.NET有一年多了,自我感觉都是些皮毛,但是足够用了,说够用,只是说现用的知识已经可以做一个象样的网站,表示层,业务逻辑层,还有数据访问层,条理清楚。。。

ASP,JSP,PHP有很多相同的地方,唯一让我觉得不爽的地方就是HTML语方和服务器脚本混在一起,对程序员来说,阅读起来不是很方便,但ASP.NET却不同,两者完全分开。。。这一点自我感学比较爽!

ASP.NET还有一个特点,可以在发布网站的时候编译成DLL动态链接库,版权所有,严禁转载!不过自己想看别人的代码的时候,就不是那么方便了。

ASP.NET有很多控件,使用方便,尤其是数据源控件,我最喜欢GRIDVIEW,实现同样的功能,ASP,PHP还有JSP可能要用3倍以上的代码量,效率不是那么的高。。

以前总有这样的一个想法:真正的程序员用C,聪明的程序用C++、JAVA,现在觉得C#也不错,当然.NET只是M

Read More →

关于ASP.NET中用Response.Write()方法响应导致页面字体变大的问题

比方说在页面里面有个LinkButton,要点击以后要打开新窗口,而且新窗口的URL是根据用户选择结果动态产生的。LinkButton的代码这样写:

protected void ServiceManHistoryButton_Click(object sender, EventArgs e)
{
 Response.Write("<script>window.open('xxx.html')");
}

 运行以后会发现,新窗口是打开了,但是原来页面的字体变大了,奇怪的问题!

有人想也不想就说是CSS没设置好,对这些人我很无语,求教的时候最怕遇到他们。

实际原因是直接Response.write输出脚本代码到顶部,打乱了文档模型,所以造成了这样的结果。

OK,解决方法有两个。

方法一:把Response.Write()语句替换为这个

Page.RegisterStartupScript("ServiceManHistoryButtonClick", "<script>window.open('xxx.html')");

这个方法用于在页响应中发出客户端脚本块,前一个参数是该Script在页面中的唯一名称(随便起,不重复就行),后一个是脚本内容。这个方法应该是微软官方推荐的方法。

方法二:在原程序的Response.Write()语句后再加一句

Response.Write("<script>document.location=document.location;</script>");

想出这个办法的人真高!

Read More →

ASP.NET读取Web.config中的自定义数据

从Web.config中读取自定义数据是经常用到的,比如读取数据库配置信息。下面就以读取数据库配置信息为例。

首先看如下代码

 程序代码

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <appSettings>

  <add key="AccessFile" value="DB/db.mdb"/>

  </ap

Read More →

ASP.NET 2.0中嵌套母版页的应用

之前写过母版页的使用,但那只是在一个页面使用了母版页。但实际中需要使用多个母版嵌套使用的情况,也就是父母版页中还要包含子母版页。

default.aspx

<%@ Page Language="VB" MasterPageFile="Child.Master"%>

<asp:Content id="Content1" ContentPlaceholderID="Content1" runat="server">

   <asp:Label runat="server" id="Label1"

&

Read More →

asp.net过程中引用js文件出错的解决办法

在.net中通过这种方式引用js文件

<script type="text/javascript" src="setday0.js"></script>

然后在页面中调用setday0.js文件中的方法往往会出错!但是你如果把setday0.js文件的内容直接放到该页面中来又一点问题也没有。这个问题困惑了我很久,在1.1的时候就遇到了当时没办法就在页面中重写js代码。今天才发现了这个问题的解决办法。

这个问题是由于.net中的text编码所引起的,我们需要把setday0.js文件保存为UTF-8或者其他Unicode编码方式,问题就迎刃而解。原来的文本编码为gb2312,因为其中有汉字。

如何进行编码转换?

  1. 记事本打开,保存的时候选择Unicode编码;
  2. 直接在vs中选择另存为,保存按钮右边有个小箭头,点一下,然后选择编码方式再保存就ok。

Read More →

ASP.NET 2.0站点登录、导航与权限管理

(一)登录

  asp.net 2.0中,新增了许多新的功能和控件。其中,新增的登陆控件可谓使得WEB应用的设计更加得心应手。什么是登陆控件呢?就是我们平常在WEB应用中经常要用到的用户注册,登陆,忘记密码,登陆后根据权限的不同而显示不同的页面等功能,现在在asp.net 2.0中都已经可以由提供的控件来实现了。

  asp.net 2.0中,为了更方便创建和管理用户,以及对 Web 应用程序中的页进行密码保护,引进了新的框架membership。新的框架包含用于处理身份验证和授权的新增功能,能够同时满足 Web 站点管理员和开发人员的需要。Web 站点管理员可以利用新的 Web 站点管理工具来创建新的用户和角色,以及控制对 Web 应用程序中页面的访问。Web 站点管理工具是一组预先编写的 ASP.NET页,不具备编程技巧的用户可以使用它们来配置 Web 应用程序。利

Read More →

asp.net2.0中gridview里嵌套dropdownlist

在asp.net 2.0中,在一个gridview里,可以嵌套进一个dropdownlist,这是十分容易的事情,而这里讲的是,
在每个dropdownlist里,都绑定的是不同的内容,比如在northwind数据库中,可以用GRIDVIEW显示出
每个category类别,同时每一行的category类别里可以已dropdonwlist下拉框的形式,列出该分类下的所有
产品.下面介绍实现的方法

首先是页面部分的代码

<asp:gridview id="GridView1" runat="server" autogeneratecolumns="False" onrowdatabound="GridView1_RowDataBound">
	<columns>
		<asp:boundfield datafield="CategoryID" headertext="CategoryID">
		</asp:boundfield>
		<asp:boundfield datafield="CategoryName" headertext="Category Name">
		</asp:boundfield>
		<asp:templatefield headertext="Products">
			<itemtemplate>
				<asp:dropdownlist id="DropDownList1" runat="server">
				</asp:dropdownlist>
			</itemtemplate>
		</asp:templatefield>
	</columns>
</asp:gridview>

Read More →

一般IIS运行不了ASP.NET,试一下下面四种方法,99%有效

我用的第一种,一下子就解决了啊。。。

1、.NET 安装的顺序应该是先装IIS,再装VS.NET,如果次序反了,或者IIS重装了,就需要使用aspnet_regiis.exe -i来重新安装IIS Mapping(主要用于aspx, asmx等文件的Extention的匹配)。在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下,运行下面的命令:aspnet_regiis.exe -i

2、重设ASPNET的密码,然后在下面的目录中找到Machine.config文件:%Systemroot%Microsoft.NET\Framework\v2.0.50727\CONFIG(Systemroot是你的安装目录),在 标识中添加/修改:userName和password3。如果还不行,重装IIS,然后再按照方法1进行操作4。如果你的机器是域控制器,你可以参考Q315158:ASP.NET Does Not Work withASPNET Account on Domain Controller:http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q315158&和你大致讲一下操作的步骤:

  1. 在Administrative Tools->Active Directory Users and Computers中建立一个名为ASPUSER的用户,将该用户添加到用户组中(默认情况下已在User Group中)
  2. 在Administrative Tools->Local Security Settings->Local Policy->UserRight Assignment中,双击右栏的Log on as a batch job项,在弹出的窗口中点击Add,选择或输入刚才建立的ASPUSER帐号,确定。(需要重启机器)
  3. 确保ASPUSER帐号有相应文件、目录的访问权限4。在下面的目录中找到Machine.config文件:%Systemroot%Microsoft.NETFrameworkv1.0.3705CONFIG (Systemroot是你的安装目录),在 标识中添加/修改:

userName="DomainNameASPUSER" password="ASPUSERpassword" 其中ASPUSERpassword是刚刚建立的ASPUSER的密码,DomainName是你的域名

  1. 最后把机器RESET一下!看看!应该OK了!

Read More →