仿豆瓣分页代码js版的.Net封装

2008-09-02

原文:
仿豆瓣分页代码js版
很多地方用到了这个分页,每个页面都得导入js,当然,你也可以将js放到一个UserControl中,再引入到aspx中。
为避免麻烦,封装成了一个控件

有需要的朋友可以直接拿去用
SmartPager.rar (25.61 kb)
这里未涉及到任何数据绑定操作,请自行完成。
该控件仅仅完成Render页码的行为,如果您有兴趣,可以完成数据绑定。

浅谈BlogEngine扩展机制的实现

2008-07-29

以前写过一个针对于Blogengine的Mp3播放器扩展
在Blogengine里,每一个扩展的Class都必须有Extension标记
ExtensionAttribute是一个密封类,继承自System.Attribute,System.Attribute没有任何实现,只是一个标记而已。
ExtensionAttribute类的代码:

[AttributeUsage(AttributeTargets.Class)] //指明该Attrubite只能应用于Class上
public sealed class ExtensionAttribute : System.Attribute
{
/// <summary>
/// Creates an instance of the attribute and assigns a description.
/// </summary>
public ExtensionAttribute(string description, string version, string author)
{
_Description = description;
_Version = version;
_Author = author;
}

private string _Description;
/// <summary>
/// Gets the description of the extension.
/// </summary>
public string Description
{
get { return _Description; }
}

private string _Version;

/// <summary>
/// Gets the version number of the extension
/// </summary>
public string Version
{
get { return _Version; }
}

private string _Author;

/// <summary>
/// Gets the author of the extension
/// </summary>
public string Author
{
get { return _Author; }
}

}

这个类非常之简单,只是一些描述性的信息,如作者、版本、描述等。
到这里,ExtensionAttribute类就可以应用在任何一个Class上了
看看mp3player.cs

/// <summary>
/// 增加flashMp3播放器
/// </summary>
[Extension("mp3 player", "1.0.0.0", "lemongtree.com")] //此处给mp3player类打上Extension标记
public class mp3player
{
public mp3player()
{
Post.Serving += new EventHandler<ServingEventArgs>(Post_Serving);
}
private void Post_Serving(object sender, ServingEventArgs e)
{
//此处略过
}
}

mp3player就是一个针对于Post的扩展了。
有朋友可能会问了:mp3player这个在什么时候实例化的呢?或是我如何得知这个扩展是不是Enable的呢?
整个实例化的过程在global.asax的Application_Start事件中

Assembly a = Assembly.Load(assemblyName);
Type[] types = a.GetTypes(); //获取当前程序集中的所有类型

foreach (Type type in types)
{
object[] attributes = type.GetCustomAttributes(typeof(ExtensionAttribute), false); //获取含有ExtensionAttribute标记的类
foreach (object attribute in attributes)
{
if (ExtensionManager.ExtensionEnabled(type.Name))
{
a.CreateInstance(type.FullName); //创建实例
}
}
}

到这里很明了了,扩展类决定于它有没有打Extension标记,是否创建实例取决于该扩展有没有被启用.
BlogEngine有很多地方是值得我们学习的.

SqlMemberShip RoleProvider for blogengine

2008-07-28

自上次完成SqlDataProvider后
今天再次完成SqlMembershipProvider及RoleProvider
表结构
be_Users表

CREATE TABLE [dbo].[be_users](
[UserID] [int] IDENTITY(1000,1) NOT NULL,
[UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_be_users_UserName] DEFAULT (''),
[UserPassword] [varchar](100) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_be_users_UserPassword] DEFAULT (''),
[UserEmail] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_be_users_UserEmail] DEFAULT (''),
CONSTRAINT [PK_be_users] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

be_roles表

CREATE TABLE [dbo].[be_Roles](
[RoleID] [int] IDENTITY(1,1) NOT NULL,
[RoleName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_be_Roles_RoleName] DEFAULT (''),
CONSTRAINT [PK_be_Roles] PRIMARY KEY CLUSTERED
(
[RoleID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

be_UserRole表

CREATE TABLE [dbo].[be_UserRole](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[RoleName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_be_UserRole] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

代码下载:
MSSqlProvider.rar (12.60 kb)
修改web.config

......
<membership defaultProvider="MsSqlMembershipProvider">
<providers>
<clear/>
<add name="XmlMembershipProvider" type="BlogEngine.Core.Providers.XmlMembershipProvider, BlogEngine.Core" description="XML membership provider" xmlFileName="~/App_Data/users.xml"/>
<add name="MsSqlMembershipProvider" type="BlogEngine.Core.Providers.MSSqlProvider.MsSqlMembershipProvider,BlogEngine.Core" description="Sql membership provider"/>
</providers>
</membership>
<roleManager defaultProvider="SqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName=".BLOGENGINEROLES">
<providers>
<clear/>
<add name="XmlRoleProvider" type="BlogEngine.Core.Providers.XmlRoleProvider, BlogEngine.Core" description="XML role provider" xmlFileName="~/App_Data/roles.xml"/>
<add name="SqlRoleProvider" type="BlogEngine.Core.Providers.MSSqlProvider.SqlRoleProvider,BlogEngine.Core" description="" />
</providers>
</roleManager>
......

Blog切换到SqlProvider

2008-07-26

改良了MSSqlProvider.cs的代码
同时也在BusinessBase中添加了相关方法
切换到sql优点多多,关键是备份方便,不能再吃不备份的亏了。
欢迎大家测试

获取yahoo的天气预报信息

2006-05-25

下午弄出来的
准备用到blog上

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

public partial class Default2 : System.Web.UI.Page
{
    protected string _content;
    protected void Page_Load(object sender, EventArgs e)
    {
        GetWebInfo web = new GetWebInfo(new UriBuilder(@"http://weather.cn.yahoo.com/area.html?city=%CE%E4%BA%BA"));

        _content = web.LinkFind();
    }
}
class GetWebInfo
{
    public String filetext;
    public GetWebInfo(UriBuilder url)
    {
        filetext = "";
        HttpWebRequest rs = (HttpWebRequest)WebRequest.Create(url.Uri);
        try
        {
            HttpWebResponse rsp = (HttpWebResponse)rs.GetResponse();

            using (StreamReader reader = new StreamReader(rsp.GetResponseStream(), System.Text.Encoding.Default))
            {
                String tmstr = "";
                while ((tmstr = reader.ReadLine()) != null)
                {
                    filetext += tmstr;
                }
            }
        }
        catch
        {
        }
    }
    public string  LinkFind()
    {
        Regex r;
        Match m;
        string _str = "";
            r = new Regex("&lt;!--3--&gt;\\s*(?&lt;1&gt;.*[^&lt;])&lt;!--3--&gt;",
            RegexOptions.IgnoreCase | RegexOptions.Compiled);
        for (m = r.Match(filetext); m.Success; m = m.NextMatch())
        {
            _str+=m.Groups[1].ToString();
        }
        return _str;
    }
}