[Asp.Net]动态指定网页过期

mikel阅读(799)

*网页过期*

   Response.Expires   =   -1;
   Response.ExpiresAbsolute   =   DateTime.Now;
   Response.AddHeader("pragma",   "no-cache");
   Response.CacheControl   =   "no-cache";

在pageload事件里面加入

 

Response.Expires 指出当前网页经过多少时间后网页过期,单位“分钟”。IIS会根据给出的过期数值添加到HTTP头中。但由于服务器时间与客户端时间的不一致,例如时区的 原因,或者哪个出了问题,设置Response.Expires=0,将不会达到网页立即过期的效果,相反您可以通过设置 Response.ExpireAbsolute来达到立即过期的目的。更好的方式是设置Response.Expires为一个负数,例如:

<% Response.Expires=-1 %>

       也可使网页立即过期。

 

1.2.7.5.       ExpiresAbsolute

Response.ExpiresAbsolute通过设置具体的日期和时间来达到过期的效果。如果仅指定日期而没有指示时间,网页将在指定日期的午夜12:00过期;如果仅指定时间而不指定日期,网页将在脚本运行的当天那个时间过期。

<% Response.ExpiresAbsolute=#May 31,2004 11:11:11# %>

  上例将使网页在2004年5月31日11点11分11秒过期。

1.2.8.       方法

1.2.8.1.       AddHeader

AddHeader方法可以在发送的HTTP数据中添加相应的头信息。

下例将强迫客户端使用基本验证方式:

<% Response.Addheader "WWW-Authenticate", "BASIC"  %>

[Javascript]Javascript页面加载顺序

mikel阅读(768)

一、在HTML中嵌入Javasript的方法

  1. 直接在JavaScript代码放在标记对<script>和</script>之间
  2. 由<script />标记的src属性制定外部的js文件
  3. 放在事件处理程序中,比如:<p onclick="alert("我是由onclick事件执行的JavaScript")">点击我</p>
  4. 作为URL的主体,这个URL使用特殊的JavaScript:协议,比如:<a href="javascript:alert("我是由javascript:协议执行的javascript")">点击我</a>
  5. 利用javascript本身的document.write()方法写入新的javascript代码
  6. 利用Ajax异步获取javascript代码,然后执行

第3种和第4种方法写入的Javascript需要触发才能执行,所以除非特别设置,否则页面加载时不会执行。

二、Javascript在页面的执行顺序

  1. 页 面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记<script />的出现顺序, <script />标记里面的或者通过src引入的外部JS,都是按照其语句出现的顺序执行,而且执行过程是文档装载的一部分。
  2. 每个脚本定义的全局变量和函数,都可以被后面执行的脚本所调用。
  3. 变量的调用,必须是前面已经声明,否则获取的变量值是undefined。
    <script type="text/javscrpt">//<![CDATA[alert(tmp);  //输出 undefinedvar tmp = 1;alert(tmp);  //输出 1//]]></script>
  4. 同一段脚本,函数定义可以出现在函数调用的后面,但是如果是分别在两段代码,且函数调用在第一段代码中,则会报函数未定义错误。
    <script type="text/javscrpt">//<![CDATA[aa();            //浏览器报错//]]></script><script type="text/javscrpt">//<![CDATA[aa();//输出 1 function aa(){alert(1);}//]]></script>
  5. document.write()会把输出写入到脚本文档所在的位置,浏览器解析完documemt.write()所在文档内容后,继续解析document.write()输出的内容,然后在继续解析HTML文档。
    <script type="text/javascript">//<![CDATA[    document.write("<script type=\"text/javascript\" src=\"test.js\" temp_src=\"test.js\"><\/script>");    document.write("<script type=\"text/javascript\">");    document.write("alert(2);")    document.write("alert(\"我是\" + tmpStr);");    document.write("<\/script>");    //]]></script>  <script type="text/javascript">//<![CDATA[    alert(3);    //]]></script>

    test.js的内容是:

    var tmpStr = 1;    alert(tmpStr);
    • 在Firefox和Opera中的弹出值的顺序是:1、2、我是1、3
    • 在IE中弹出值的顺序是:2、1、3,同时浏览器报错:tmpStr未定义

    原 因可能是IE在document.write时,并未等待加载SRC中的Javascript代码完毕后,才执行下一行,所以导致2先弹出,并且执行到 document.write(’document.write(\"我是\" + tmpStr)’)调用tmpStr时,tmpStr并未定义,从而报错。

    解决这个问题,可以利用HTML解析是解析完一个HTML标签,再执行下一个的原理,把代码拆分来实现:

    <script type="text/javascript">//<![CDATA[    document.write("<script type=\"text/javascript\" src=\"test.js\" temp_src=\"test.js\"><\/script>");    //]]></script>  <script type="text/javascript">//<![CDATA[    document.write("<script type=\"text/javascript\">");    document.write("alert(2);")    document.write("alert(\"我是\" + tmpStr);");    document.write("<\/script>");    //]]></script>  <script type="text/javascript">//<![CDATA[    alert(3);    //]]></script>

    这样IE下和其他浏览器输出值的顺序都是一直的了:1、2、我是1、3。

三、如何改变Javascript在页面的执行顺序

  1. 利用onload
    <script type="text/javascript">//<![CDATA[window.onload = f;function f(){alert(1);}alert(2);//]]></script>

    输出值顺序是 2、1。

    需要注意的是,如果存在多个winodws.onload的话,只有最有一个生效,解决这个办法是:

    window.onload = function(){f();f1();f2();.....}

    利用2级DOM事件类型

    if(document.addEventListener){window.addEventListener("load",f,false);window.addEventListener("load",f1,false);...}else{window.attachEvent("onload",f);window.attachEvent("onload",f1);...}
  2. IE中可以利用deferdefer作用是把代码加载下来,并不立即执行,等文档装载完毕之后再执行,有点类似onload,但是没有onload那样的局限性,可以重复使用,但是只在IE中有效,所以上面的例子可以修改成为
    <script type="text/javascript">//<![CDATA[document.write("<script type=\"text/javascript\" src=\"test.js\" temp_src=\"test.js\"><\/script>");document.write("<script type=\"text/javascript\" defer=\"defer\">");document.write("alert(2);")document.write("alert(\"我是\" + tmpStr);");document.write("<\/script>");//]]></script><script type="text/javascript">//<![CDATA[alert(3);//]]></script>

    这样IE就不报错了,输出值的顺序变成:1、3、2、我是1

  3. 利用Ajax。
    因为xmlhttpRequest能判断外部文档加载的状态,所以能够改变代码的加载顺序。

[Flex]AmFast Remoting for Python

mikel阅读(919)

AmFast is a new AMF0/AMF3 encoder/decoder for Python.
• AmFast's core encoder and decoder are written in C, so it's around 18x faster than PyAmf.
• The encoder and decoder accept user-defined Python objects that allow customization of the encoding/decoding process.
• Supports custom class mapping.
• Supports remoting with NetConnection and RemoteObject.
• Remoting headers can be exposed to callable targets to allow for quick implementation of authentication and other AMF features that rely on headers.
• Supports data persistence with SQLAlchemy, including remotely-loadable lazy-loaded attributes.
• Supports Actionscript code generation for mapped classes.
Project Page
It is really great to see how opening the AMF and RTMP protocols have really improved integration with server languages. To exchange objects makes development so much easier.
Cheers,
Ted 🙂

[C#]ASP.NET MVC 1.0系列教程

mikel阅读(1081)

  1. ASP.NET MVC 1.0 – 1. 准备工作

  2. ASP.NET MVC 1.0 – 2. 流程分析 (System.Web.Routing)

  3. ASP.NET MVC 1.0 – 3. 流程分析 (MvcHandler & Controller)

  4. ASP.NET MVC 1.0 – 4. 流程分析 (ControllerActionInvoker)

  5. ASP.NET MVC 1.0 – 5. 流程分析 (ControllerActionInvoker 续)

  6. ASP.NET MVC 1.0 – 6. 流程分析 (ViewResult)

  7. ASP.NET MVC 1.0 – 7. Route Namespace

  8. ASP.NET MVC 1.0 – 8. TempData

  9. ASP.NET MVC 1.0 – 9. ModelBinder

  10. ASP.NET MVC 1.0 – 10. Controller

  11. ASP.NET MVC 1.0 – 11. ViewData

  12. ASP.NET MVC 1.0 – 12. NVelocityViewEngine

  13. ASP.NET MVC 1.0 – 13. OutputCacheAttribute

  14. ASP.NET MVC 1.0 – 14. CompressAttribute

  15. ASP.NET MVC 1.0 – 15. StaticCacheAttribute

  16. ASP.NET MVC 1.0 – 16. NoClientCacheAttribute

  17. ASP.NET MVC 1.0 – 17. Anti Attack

  18. ASP.NET MVC 1.0 – 18. ControllerContext

[C#]ASP.NET MVC : 实现我们自己的视图引擎

mikel阅读(1161)

ASP.NET MVC的一个开源项目MvcContrib中,为我们提供了几个视图引擎,例如NVelocity, Brail, NHaml, XSLT。那么如果我们想在ASP.NET MVC中实现我们自己的一个视图引擎,我们应该要怎么做呢?

我们知道呈现视图是在Controller中通过传递视图名和数据到RenderView()方法来实现的。好,我们就从这里下手。我们查看一下ASP.NET MVC的源代码,看看RenderView()这个方法是如何实现的:

protected virtual void RenderView(string viewName, string masterName, object viewData) {
ViewContext viewContext = new ViewContext(ControllerContext, viewName, masterName, viewData, TempData);
ViewEngine.RenderView(viewContext);
}//这是P2的源码,P3略有不同,原理差不多

从上面的代码我们可以看到,Controller中的RenderView()方法主要是将ControllerContext, viewName, masterName, viewData, TempData这一堆东西封装成ViewContext,然后把ViewContext传递给 ViewEngine.RenderView(viewContext)。嗯,没错,我们这里要实现的就是ViewEngine的 RenderView()方法。

ASP.NET MVC为我们提供了一个默认的视图引擎,这个视图引擎叫做:WebFormsViewEngine. 从名字就可以看出,这个视图引擎是使用ASP.NET web forms来呈现的。在这里,我们要实现的视图引擎所使用的模板用HTML文件吧,简单的模板示例代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=""http://www.w3.org/1999/xhtml"">http://www.w3.org/1999/xhtml" >
<head>
<title>自定义视图引擎示例</title>
</head>
<body>
<h1>{$ViewData.Title}</h1>
<p>{$ViewData.Message}</p>
<p>The following fruit is part of a string array: {$ViewData.FruitStrings[1]}</p>
<p>The following fruit is part of an object array: {$ViewData.FruitObjects[1].Name}</p>
<p>Here's an undefined variable: {$UNDEFINED}</p>
</body>
</html>

 

下面马上开始我们的实现。首先,毫无疑问的,我们要创建一个ViewEngine,就命名为 SimpleViewEngine 吧,注意哦,ViewEngine要实现IViewEngine接口:

public class SimpleViewEngine : IViewEngine
{
#region Private members
IViewLocator _viewLocator = null;
#endregion
#region IViewEngine Members : RenderView()
public void RenderView(ViewContext viewContext)
{
string viewLocation = ViewLocator.GetViewLocation(viewContext, viewContext.ViewName);
if (string.IsNullOrEmpty(viewLocation))
{
throw new InvalidOperationException(string.Format("View {0} could not be found.", viewContext.ViewName));
}
string viewPath = viewContext.HttpContext.Request.MapPath(viewLocation);
string viewTemplate = File.ReadAllText(viewPath);
//以下为模板解析
IRenderer renderer = new PrintRenderer();
viewTemplate = renderer.Render(viewTemplate, viewContext);
viewContext.HttpContext.Response.Write(viewTemplate);
}
#endregion
#region Public properties : ViewLocator
public IViewLocator ViewLocator
{
get
{
if (this._viewLocator == null)
{
this._viewLocator = new SimpleViewLocator();
}
return this._viewLocator;
}
set
{
this._viewLocator = value;
}
}
#endregion
}

 

在这里实现了IViewEngine接口提供的RenderView()方法,这里要提供一个ViewLocator的属性。 ViewLocator的主要就是根据控制器中传来的视图名,进行视图的定位。在RenderView()方法中首先获取视图的路径,然后把视图模板读进 来,最后进行模板的解析然后输出。

我们再来看一下ViewLocator是如何实现的。他是IViewLocator类型的,也就是说SimpleViewLocator实现了IViewLocator接口。SimpleViewLocator的实现代码如下:

public class SimpleViewLocator : ViewLocator
{
public SimpleViewLocator()
{
base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.htm",
"~/Views/{1}/{0}.html",
"~/Views/Shared/{0}.htm",
"~/Views/Shared/{0}.html"
};
base.MasterLocationFormats = new string[] { "" };
}
} 

 

我们的SimpleViewLocator 是继承自ASP.NET MVC的ViewLocator类,而ViewLocator则是实现了IViewLocator接口的。由于ViewLocator已经为了完成了全部的工作,这里我们只需修改下他的ViewLocationFormats 来使用我们自己的模板文件就可以了。

我们再来看一下类图,那就更加清楚了:

image

注:关于模板解析的部分代码这里就不说了,不在讨论范围内,可以自己下载代码来看

现在我们基本完成了我们的视图引擎,那么如何让ASP.NET MVC不要使用默认的web forms视图引擎,而使用我们自定义的视图引擎呢?

在ASP.NET MVC中,所有的请求都是通过一个工厂类来创建Controller实例的,这个工厂类必须实现 IControllerFactory 接口。默认的实现该接口的工厂类是DefaultControllerFactory。这个工厂类就是我们修改默认的视图引擎为我们的视图引擎的入口点。 为了方便,我们创建一个继承自DefaultControllerFactory的SimpleControllerFactory :

public class SimpleControllerFactory : DefaultControllerFactory
{
protected override IController CreateController(RequestContext requestContext, string controllerName)
{
Controller controller = (Controller)base.CreateController(requestContext, controllerName);
controller.ViewEngine = new SimpleViewEngine();//修改默认的视图引擎为我们刚才创建的视图引擎
return controller;
}
} 

这里只要修改controller.ViewEngine为我们自定义的ViewEngine就可以了.最终的类图大概如下:

image

要使我们创建的控制器工厂类SimpleControllerFactory 成为默认的控制器工厂类,我们必须在Global.asax.cs中的Application_Start 事件中添加如下代码:

ControllerBuilder.Current.SetControllerFactory(typeof(SimpleControllerFactory));

到这里,我们已经完成了我们自己的视图引擎。

在ASP.NET MVC中实现自定义的视图引擎是很简单的,难点在于模板的解析,具体大家可以研究MvcContrib中的四个视图引擎的代码。最近要对模板引擎进行研究,大家有什么其他优秀的、成熟的、开源的模板引擎,麻烦给小弟推荐一下,先谢了。

Enjoy!

版权声明:本文首发于博客园,作者为QLeelulu
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

参考文章:
ASP.NET MVC Preview生命周期分析
Creating a custom ViewEngine for the ASP.NET MVC framework(下面给出的源代码就是这篇文章给出的源代码)

 

本文源码下载: ASP.NET MVC 自定义视图引擎源代码下载

[应用]扩增实境:GE 替代能源网站

mikel阅读(819)

扩增实境是个近来发展得很快的领域,但想不到的是,这么快就已经有大型的公司在网站上利用这个技术了。GE 的 Ecomagination 网站没有真的利用扩增实境来做什么非常有意义的事,但光是看到扩增实境应用在网页上本身就是个很强悍的进步。继续阅读里看我们完整的操作影片吧~

[IE]IE不能显示Flash动画

mikel阅读(663)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility 下建了个
clsid :{D27CDB6E-AE6D-11CF-96B8-444553540000}
Click to Open in New Window
就是它禁用了flashplayer的activex控件,马上删除,
刷新页面,真是立竿见影啊,一切正常。

[书籍]SEO:Google搜索引擎优化入门指南

mikel阅读(861)

Google搜索引擎优化入门指南
作者:Google 网站管理员中心翻译:个篱
欢迎来到Google 的搜索引擎优化SEO 向导。这个文档最初仅仅用于Google 内部团队,但是我们想也许它
对那些才刚刚接触搜索引擎优化(SEO)并且希望让自己的网站在用户和搜索引擎两者上都得到很好交互
性的网站管理员们有所帮助,便把它发布了出来。虽然这个手册并不能告诉你任何关于如何把你的网站
自动置于Google 查询第一位置的秘密,但是适当地遵循下面给出的最优方案可以让搜索引擎更好的爬行
和索引你网站的内容。
搜索引擎搜索常常是指对你网站的某些部分作适当的修饰。对个别访问而言这些改变或许看起来是逐渐增
加的;但是和其它优化结合起来时,不管是对你网站的访问者还是在搜索引擎结果上的表现这些改变的
影响都是显而易见的。也许你已经非常熟悉下面列出的一些帮助性提示,因为它们几乎是所有网页的构成
元素,但你也可能不会用到其中的大部分。

[SQL]利用事务日志来恢复Update、Delete误操作引起的数据丢失

mikel阅读(873)

可能有不少朋友遇到过这样的问题:
update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,
这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份
或不能备份日志(truncate log on checkpoint选项为1),那么就无法进行数据的恢复了,或者
只能恢复到最近一次的备份的数据了。

以下简单说明恢复数据方法:
1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进
进行一次日志备份(如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了)
backup log dbName to disk='fileName'
2,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢

restore database dbName from disk='fileName' with norecovery
3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻
restore log dbName from disk='fileName'
with stopat='date_time'

当然,如果误操作是一些不记日志的操作比如truncate table,select into等操作,那么是无法利
用上述方法来恢复数据的…