仿豆瓣分页代码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; }
}
}
这个类非常之简单,只是一些描述性的信息,如作者、版本、描述等。 mp3player就是一个针对于Post的扩展了。 foreach (Type type in types) 到这里很明了了,扩展类决定于它有没有打Extension标记,是否创建实例取决于该扩展有没有被启用.
到这里,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这个在什么时候实例化的呢?或是我如何得知这个扩展是不是Enable的呢?
整个实例化的过程在global.asax的Application_Start事件中
Assembly a = Assembly.Load(assemblyName);
Type[] types = a.GetTypes(); //获取当前程序集中的所有类型
{
object[] attributes = type.GetCustomAttributes(typeof(ExtensionAttribute), false); //获取含有ExtensionAttribute标记的类
foreach (object attribute in attributes)
{
if (ExtensionManager.ExtensionEnabled(type.Name))
{
a.CreateInstance(type.FullName); //创建实例
}
}
}
BlogEngine有很多地方是值得我们学习的.
SqlMemberShip RoleProvider for blogengine
2008-07-28自上次完成SqlDataProvider后 be_roles表 be_UserRole表 代码下载:
今天再次完成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]
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]
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("<!--3-->\\s*(?<1>.*[^<])<!--3-->",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
for (m = r.Match(filetext); m.Success; m = m.NextMatch())
{
_str+=m.Groups[1].ToString();
}
return _str;
}
}