2010年2月7日

ASP.NET的页面中对其他文件的引用

先来看看ASP风格的

===============

你可以把一个ASP页面的内容在服务器执行之前添加到另外一个ASP页面中, 方式是使用#include命令.

 

#include命令被用来创建函数, headers, footers, 或者将要被多个页面重用的部分.

 

如何使用?

这是"mypage.asp"

<html>
<body>
    <h3>
        Words of Wisdom:</h3>
    <p>
        <!--#include file="wisdom.inc"-->
    </p>
    <h3>
        The time is:</h3>
    <p>
        <!--#include file="time.inc"-->
    </p>
</body>
</html>

 

这是"wisdom.inc"文件

"One should never increase, beyond what is necessary,
the number of entities required to explain anything."

 

这是"time.inc"文件

<%
Response.Write(Time)
%>

 

如果你在浏览器里查看源代码, 你会看到这样:

<html>
    <body>
        <h3>
            Words of Wisdom:</h3>
        <p>
            "One should never increase, beyond what is necessary, the number of entities required
            to explain anything."</p>
        <h3>
            The time is:</h3>
        <p>
            11:33:42 AM</p>
    </body>
</html>

 

语法

<!--#include virtual="somefilename"-->
这里的virtual表明地址是起自一个虚拟路径. 比如说, 一个名叫header.inc的文件存在于一个叫做/html的虚拟目录下, 那么下面的一段命令会插入header.inc的内容

<!-- #include virtual ="/html/header.inc" -->


<!--#include file ="somefilename"-->

这里的file表明路径是一个相对路径. 如果有一个文件在html文件夹下, 并且header.inc文件存在于html\headers中, 那么下面的代码会插入header.inc文件的内容

<!-- #include file ="headers\header.inc" -->

 

 

在ASP.NET页面中动态包括HTML文件和客户段脚本文件

===========================

因为ASP.NET应用程序在发送给客户端之前要经过编译, 运行的, 所以在服务器端include文件的时候, 你不能使用变量来替代文件名(比如说:<!-- #include PathType = FileName –>" ). 然而, 你可以使用Response或者StreamReader对象来向HTML流中写入被include的文件.

 

举例:

   <%@ Page Language="vb" AutoEventWireup="false"%>
   <html>
   <body>
        <%           
          Response.WriteFile ("Yourfile.inc")
        %>
   </body>
   </html>

 

 

在ASP.NET页面中插入指定文件的内容, 包括Web pages(.aspx文件), user control files(.ascs文件), 还有Global.asax文件

============================

语法, 与ASP风格的include 相同.

<!-- #include file|virtual="filename" -->

 

Remarks

赋予File或者Virtual属性的值必须被双引号括起来(""). 被included的文件会在任何动态代码执行前被处理. Include文件能被用来包含从静态文本(比如说普通的页面header或者公司地址), 到包含土工的服务器端代码(server-side code), 控件(control), 或者开发者想要插入到其他页面中的HTML标签块.

 

尽管你也可以使用这个#include 的方式来重用代码, 在ASP.NET中通常的更好的方式是使用Web user controls. 因为user control提供了面向对象的编程模型, 而且比服务器端的include功能更加强大.

 

#include标签必须被HTML或XML的注释边界符括起来, 来避免它被解释成为字面上的文本.

 

举例:

<html>
   <body>
      <!-- #Include virtual="/include/header.inc" -->
        Here is the main body of the .aspx file.
      <!-- #Include virtual="/include/footer.inc" -->
   </body>
</html>

 

参考资料:

How To Dynamically Include Files in ASP.NET

http://support.microsoft.com/kb/306575

Server-Side Include Directive Syntax

http://msdn.microsoft.com/en-us/library/3207d0e3.aspx

ASP Including Files

http://www.w3schools.com/asp/asp_incfiles.asp

posted @ 2010-02-07 22:51 中道学友 阅读(485) 评论(0) 编辑

如何创建强命名程序集, 如何查看强命名程序集的PublicKeyToken

如何创建强命名程序集

===================

1. 在Visual Studio中的class library工程上点右键, 选择properties.

2.  选择左边的Signing选项卡.

3. 勾选Sign the assembly复选框. 在下拉列表中选择<New...>.

2-7-2010 9-09-21 PM

4. 在弹出的对话框中给snk文件起一个名字. 按OK.

2-7-2010 9-10-23 PM

5. 程序集强命名完成.

2-7-2010 9-12-32 PM

 

如何查看强命名程序集的public key token

=========================

有时候你需要在web.config文件中或者其他地方引用自己写的强命名程序集, 你需要写入像下面这样的fully qualified name:

MyNamespace.MyAssembly, version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

 

前面三个部分比较容易获得, 因为是你自己写的, 你当然知道assembly的名字, 版本, 还有culture信息. 比较麻烦的部分是如何获得自己签名的程序集的public key token. 一种平常的方法是使用Reflector来打开自己的程序集, 然后获得token(实际上, Reflector会给你如同上面例子那样的完整信息). 但是这有的时候还是显得有点未免杀鸡用牛刀了. 如果你已经打开了Visual Studio, 那么仅仅是在VS的菜单里点一个菜单项就能获得答案不是更好么? 下面就是步骤.

 

1. 在Visual Studio中, 打开Tools菜单, 然后点击External Tools这个菜单项.

2. 在弹出的External Tools对话框中, 点击Add按钮.

3. 按照下图进行配置. sn.exe这个工具在不同版本的VS下处于不同的文件夹中. 最简单的找到它的方式是在VS Command Prompt中输入"where sn.exe". 在参数框里写入"-T $(TargetPath)". 然后勾选"Use Output Window". 这样的话, 结果就会在VS的output window. 然后点击OK,

2-7-2010 9-27-57 PM

4. 结果如图.

2-7-2010 9-33-28 PM

5. 在输出窗口可以看到结果. 这在你的solution里有多个project的时候也是可以正常工作的. 只需要点击一下Solution Explorer中的Project, 然后点击我们的菜单项就可以了.

2-7-2010 9-35-31 PM

 

资料来源:

http://blogs.msdn.com/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx

posted @ 2010-02-07 21:36 中道学友 阅读(853) 评论(0) 编辑

SharePoint中的EventReceiver 之四 为Content Type编写Event Handler

在前面的部分, 我们创建了CompanyItemEventReceiver类来在Company names中使用大写来保持数据完整性. 作为这个Event Receiver的系列的最后部分, 我们现在希望展现一下如何把event receiver类中的event handler绑定到Company这个Content Types上. 这是通过在content type的definition中使用一个inner XmlDocument节点, 下面进行了举例. 你可以看到, 每一个event handler都必须被单独地使用相同地信息来绑定.

 

<ContentType ID="0x0100E71A2716C18B4e96A9B0461156806FFA" Name="Company" >
  <!-- FieldRefs element omitted for clarity -->
  <!-- event handlers added to content type using XmlDocument element -->
  <XmlDocuments>
    <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/events">
      <spe:Receivers xmlns:spe="http://schemas.microsoft.com/sharepoint/events">
        <spe:Receiver>
          <spe:Name>ItemAddedReceiver</spe:Name>
          <spe:Type>ItemAdded</spe:Type>
          <spe:Assembly>LitwareTypes, [full 4-part assembly name] </spe:Assembly>
          <spe:Class>LitwareTypes.CompanyItemEventReceiver</spe:Class>
        </spe:Receiver>
        <spe:Receiver>
          <spe:Name>ItemUpdatedReceiver</spe:Name>
          <spe:Type>ItemUpdated</spe:Type>
          <spe:Assembly>LitwareTypes, [full 4-part assembly name] </spe:Assembly>
          <spe:Class>LitwareTypes.CompanyItemEventReceiver</spe:Class>
        </spe:Receiver>
      </spe:Receivers>
    </XmlDocument>
  </XmlDocuments>
</ContentType>

 

译自:

Inside Microsoft Windows SharePoint Services 3.0

posted @ 2010-02-07 13:52 中道学友 阅读(266) 评论(0) 编辑

SharePoint中的EventReceiver 之三 编写Event Handler

编写一个event handler来仅在满足某种条件的时候才允许某个动作的执行, 是非常常见的. 比如说, 你可以写一个ItemDelete handler, 来在当前用户不是站点管理员时取消掉删除动作.

public class VendorItemEventReceiver : SPItemEventReceiver
{
    public override void ItemDeleting(SPItemEventProperties properties)
    {
        if (!properties.OpenWeb().CurrentUser.IsSiteAdmin)
        {
            properties.Status = SPEventReceiverStatus.CancelWithError;
            properties.ErrorMessage = "Vendor can only be deleted by site administrator";
            properties.Cancel = true;
        }
    }
}

 

为before event编写event handler, 在其中添加某些合法性判断的逻辑也是非常平常的. 比如说, 假设一个场景, 其中你想要添加到Vendor列表的item包含一个至少7个字符长的电话号码. 所以, 你必须提供一个ItemAdding的event handler还有一个ItemUpdating的event handler来执行validation的逻辑. 下面的例子展现了一个如何创建一个这样的event handler, 还有个叫做PhoneIsValid的helper方法, 这样你就能够在一个方法中来处理所有的validation的逻辑了.

public class VendorItemEventReceiver : SPItemEventReceiver
{
    // provide method with validation logic
    private bool PhoneIsValid(string Phone)
    {
        if ((Phone == null) || (Phone.Length < 7))
            return false;
        else
            return true;
    }

    // provide error message
    const string PhoneInvalidErrorMessage =
          "VALIDATION ERROR: Phone must be at least 7 digits.";

    public override void ItemAdding(SPItemEventProperties properties)
    {
        // validate Phone column for new vendor item
        string Phone = properties.AfterProperties["WorkPhone"].ToString();
        if (!PhoneIsValid(Phone))
        {
            properties.Status = SPEventReceiverStatus.CancelWithError;
            properties.ErrorMessage = PhoneInvalidErrorMessage;
            properties.Cancel = true;
        }
    }

    public override void ItemUpdating(SPItemEventProperties properties)
    {
        // validate Phone column for update to vendor item
        string Phone = properties.AfterProperties["WorkPhone"].ToString();
        if (!PhoneIsValid(Phone))
        {
            properties.Status = SPEventReceiverStatus.CancelWithError;
            properties.ErrorMessage = PhoneInvalidErrorMessage;
            properties.Cancel = true;
        }
    }
}

 

注意ItemAdding和ItemUpdating这两个event handler必须获得用户想要保存的WorkPhone列的值. 这些event handler方法通过使用SPItemEventProperties参数的AfterProperties属性来获得这个column的值. AfterProperties 允许你使用field的underlying name来访问正在被修改的item的column的值(不是DisplayName). 同样地, SPItemEventProperties 参数还暴露了一个叫做BeforeProperties 的属性, 这样你可以确定在column被修改之前的初始值.

 

before events典型地被用来做合法性验证, 而after events可以被用来保持数据完整性或者开启自定义的某些操作. 想象一个场景, 其中公司名必须都是大写字符. 在这个例子中, 我们会为after events写event handlers来在column的值被修改的任何时候重新格式化值.

public class CompanyItemEventReceiver : SPItemEventReceiver
{
    // custom logic to format a field value
    private string FormatCompanyName(string value)
    {
        return value.ToUpper();
    }

    public override void ItemAdded(SPItemEventProperties properties)
    {
        DisableEventFiring();
        string CompanyName = properties.ListItem["Company"].ToString();
        properties.ListItem["Company"] = FormatCompanyName(CompanyName);
        properties.ListItem.Update();
        EnableEventFiring();
    }

    public override void ItemUpdated(SPItemEventProperties properties)
    {
        DisableEventFiring();
        string CompanyName = properties.ListItem["Company"].ToString();
        properties.ListItem["Company"] = FormatCompanyName(CompanyName);
        properties.ListItem.Update();
        EnableEventFiring();
    }
}

 

你应该注意到上面的例子中对方法DisableEventFiringEnableEventFiring的调用. 通过在event handler中禁用event handling, 你能够更新列表中的columns而不会引发额外的事件fire. 这对于防止递归行为是很有必要的, 要不然的话event handler会不断地激发自己.

 

译自:

Inside Microsoft Windows SharePoint Services 3.0

posted @ 2010-02-07 13:40 中道学友 阅读(626) 评论(0) 编辑

SharePoint中的EventReceiver 之二 绑定Event Receiver到列表类型或列表实例

要创建一个Event Receiver, 你必须创建继承自一个特别的由WSS Object Model的event receiver的基类. 还一个很重要的地方需要注意的是, event receiver类必须在投入使用或测试之前, 编译到强命名的程序集, 并被部署到GAC中.

 

下面的例子中的类继承自SPListEventReceiver, 所以它可以处理基于列表的事件. 就像所有的event receiver类中一样, 你通过重写在基类里定义的方法来创建event handler方法的实现.

using System;
using Microsoft.SharePoint;

namespace LitwareTypes
{
    public class VendorListEventReceiver : SPListEventReceiver
    {

        public override void FieldAdding(SPListEventProperties properties)
        {
            properties.ErrorMessage = "You cannot change this list schema!";
            properties.Cancel = true;
        }

        public override void FieldUpdating(SPListEventProperties properties)
        {
            properties.ErrorMessage = "You cannot change this list schema!";
            properties.Cancel = true;
        }

        public override void FieldDeleting(SPListEventProperties properties)
        {
            properties.ErrorMessage = "You cannot change this list schema!";
            properties.Cancel = true;
        }
    }
}

 

这个VendorListEventReceiver通过重载名字为FieldAdding, FieldUpdating, 和FieldDeleting的三个方法提供了三个event handler. 因为所有这三个events都是在事件发生之前被处理的, 不管是那种原因引起事件的触发, 这些event handlers都可以取消掉事件. 在这种情况下, 三个event handler使用SPListEventProperties参数来赋予一个错误信息, 然后取消了事件.  在这些event handler被恰当地绑定到列表之后, 他们会阻止用户(即使是有管理员权限的用户)向列表中添加, 修改, 或删除任何一个field.

 

现在让我们来讨论一下如何把event receiver类中的event handler与一个列表类型绑定起来. 你可以通过在一个feature中添加一个receiver element来完成绑定. Receivers Element有一个值为10001的ListTemplateId 属性, 它绑定receivers到自定义的列表类型的所有的实例上. 注意, 在Receiver element之中, 每一个event handler都有一个独立的Receivers element. 你应该观察到每一个event handler方法都必须绑定到它自己的Receiver Element上, 因为没有其他的方法能够一次绑定多个event handler.

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <!-- Receivers element can only be used in feature where Scope=Web -->
  <Receivers ListTemplateId="10001" >
    <Receiver>
      <Name>Field Adding Event</Name>
      <Type>FieldAdding</Type>
      <Assembly>LitwareTypes, [full 4-part assembly name goes here] </Assembly>
      <Class>LitwareTypes.VendorListEventReceiver</Class>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>Field Updating Event</Name>
      <Type>FieldUpdating</Type>
      <Assembly>LitwareTypes, [full 4-part assembly name goes here] </Assembly>
      <Class>LitwareTypes.VendorListEventReceiver</Class>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>Field Deleting Event</Name>
      <Type>FieldDeleting</Type>
      <Assembly>LitwareTypes, [full 4-part assembly name goes here] </Assembly>
      <Class>LitwareTypes.VendorListEventReceiver</Class>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>

 

上面的通过Receivers element来绑定event handler的技术有几个值得注意的局限性.

  • 首先, Receivers element只能被用在站点范围的features中. 它不能被使用在scope为其他等级的feature中, 这意味着我们不能使用这种绑定event的技术站点集级别的feature中.
  • 第二, Receiver element仅允许你绑定event handler到一个列表类型上. 它不提供给你绑定event handlers到列表实例或者绑定到一个content type的灵活性. 在许多情况下, 你会需要WSS object model来绑定你的event handler, 因为这种通过Object Model的方式提供了更大的灵活性.

现在我们来讨论一下如何绑定event handlers到一个列表实例上, 而不是绑定到列表类型上. 下面的例子展现了使用WSS Object Model来绑定VendorListReceiver类的event handler到名为Vendors的列表实例上. 这里的代码是写在FeatureActived方法中的. 当你使用这种方式添加event handler的时候, 事件绑定的信息会被写入内容数据库中, 就如同其他修改目标列表的自定义一样.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPSite siteCollection = (SPSite)properties.Feature.Parent;
    SPWeb site = siteCollection.RootWeb;
    SPList lstVendors = site.Lists["Vendors"];
    string asmName = "LitwareTypes, [full 4-part assembly name goes here] ";
    string listReceiverName = "LitwareTypes.VendorListEventReceiver";
    // add event receiver to fire before new column is added
    lstVendors.EventReceivers.Add(SPEventReceiverType.FieldAdding,
                                  asmName, listReceiverName);
    // add event receiver to fire before existing column is updated
    lstVendors.EventReceivers.Add(SPEventReceiverType.FieldUpdating,
                                  asmName, listReceiverName);
    // add event receiver to fire before existing column is updated
    lstVendors.EventReceivers.Add(SPEventReceiverType.FieldDeleting,
                                  asmName, listReceiverName);
}

 

译自:

Inside Microsoft Windows SharePoint Services 3.0

posted @ 2010-02-07 12:28 中道学友 阅读(516) 评论(0) 编辑

Hyper-V中的“Network adapter “和“Legacy Network adapter”之间的区别

在Hyper-V的虚拟网络中, 有两种类型的网络适配器(network adapter), 第一种是""Network Adapter", 另一种是"Legacy Network Adapter". 

 

这两者之间的区别非常简单.

  • 在你需要PXE启动, 或者在安装integrate components之前你的虚拟机OS需要访问网络, 你就需要Legacy Network Adapter.
  • 在你安装了integrate components(是的, 这个组件里包含了Network Adapter正常工作所需要的虚假驱动)之后, 你需要Network Adapter.

所以, 如果你想要百分百地确保在安装阶段虚拟机能访问网络, 你就应该使用"Legacy Network Adapter"

 

============华丽的分割线==============

 

OS安装好以后, 你应该添加integrated components. 使用Hyper-V工具来插入Integrated Components ISO镜像, 然后安装Integrated Components, 然后重启. 最简单的方法是在整个安装阶段都使用Legacy Network Adapter, 然后添加Integrated Components, 关机, 编辑虚拟机配置, 移除掉Legacy Network Adapter并替换为一个"Network Adapter".

 

或许你想确保正确的启动顺序. 简单地这样做:

  1. 在Hyper-V中创建虚拟机, 选择从网络安装操作系统("install the operating system from the network"). 不要启动机器.
  2. 编辑机器, 这样你就有了2个或4个CPU.(这仅在某些Win2k8 64位上可行)
  3. 修改启动顺序, 以便于符合你的需求.
  4. 启动机器, 运行安装, 结束安装, 再安装"Integrated Components"
  5. 关掉虚拟机, 编辑虚拟机配置, 移除"Legacy Network Adapter", 然后添加一个"Network Adapter".

你也许会问一个问题"为什么要替换?", 答案很简单. Legacy Network Adaapter有点慢, 因为他运行在parent partition的ring 3的工作进程下, 而"Network Adapter"使用新的高速vmbus.

 

注意: "The new server solutions"并不被Hyper-V支持. 未来可能会支持.

注意2: 记住一点, 如果你选择从网络安装(创建虚拟机时), Hyper-V会选择Legacy Network Adapter, 其他情况下, 会选择Network Adapter

 

译自:

Hyper-V : The Differences between a the “Network adapter “and the “Legacy Network adapter”

http://itbloggen.se/cs/blogs/micke/archive/2008/01/22/hyper-v-the-differences-between-a-the-network-adapter-and-the-legacy-network-adapter.aspx

posted @ 2010-02-07 11:13 中道学友 阅读(664) 评论(0) 编辑

Hyper-V的三种网卡

External

=======

虚拟机和物理网络、本地主机都能通信

 

Internal

=======

虚拟机之间互相通信,并且虚拟机能和本机通信

 

Private

=======

仅允许运行在这台物理机上的虚拟机之间互相通信

posted @ 2010-02-07 10:30 中道学友 阅读(129) 评论(0) 编辑

技术追求准确,态度积极向上