里使用的新闻发布系统需要用到一个控件:FreeTextBox,工具是VS2005(VS2008使用可能略有不同)
(1) 数据库表的设计:
表TEST_NEWS-> PK_ID(主键自增),TITILE(新闻标题),CONTENT(BLOB,新闻内容[图片或是文档附件等]),FJ(VARCHAR2(),附件的名称)
(2) 页面:
可先把所有的文件放到一个名为NEWS的文件夹下,其中有控件所需的图片文件夹image,此文件夹为控件自带,具体位置不固定,需要在前台页面对其进行设置。还有三个
固定的页面文件ftb.colorpicker.aspx,ftb.imagegallery.aspx,ftb.inserttable.aspx。[此三个文件在VS2008下不需要进行引用],在系统BIN文件夹下需要引用控件DLL
文件FreeTextBox.dll。再添加一个uploads的文件夹存上上传的附件.
NEWS.ASPX(发布[修改]页面):
<1>在页首<%PAGE%>定义中添加 ValidateRequest="false"
<2>在<%PAGE%>下面添加控件引用 <%@ Register Assembly="FreeTextBox" Namespace="FreeTextBoxControls" TagPrefix="FTB" %>
<3>在JS中添加如下代码[添加文件功能时所用]:
function Return() { window.navigate("News.aspx") }
function AddAttachments() {
document.getElementById('attach').innerText = "继续添加附件";
tb = document.getElementById('attAchments');
newRow = tb.insertRow();
newRow.insertCell().innerHTML = "<input name='File' id='File' size='50' type='file'> <input type=button value='删除'
οnclick='delFile(this.parentElement.parentElement.rowIndex)'>";
}
function delFile(index) {
document.getElementById('attAchments').deleteRow(index);
tb.rows.length > 0 ? document.getElementById('attach').innerText = "继续添加附件" : document.getElementById('attach').innerText = "添加附件";
}
<4>因为有上传附件的功能 在页面<from>中需要添加 enctype="multipart/form-data"
<5>页面定义:
标题:<asp:TextBox ID="txt_title" Width="39%" runat="server" />
内容:
<FTB:FreeTextBox ID="txt_nr" Width="100%" Height="280px" runat="server" ButtonPath="images/ftb/office2003/"
ImageGalleryPath="images/userimage" BackColor="158, 190, 245"></FTB:FreeTextBox>
其中buttonPath为控件的图片路径。
附件:
<asp:Label ID="lblFJ" runat="server" Text=" "></asp:Label>
<div><table id="attAchments"></table></div>
<a id="attach" style="font-family: 宋体; font-size: 9pt;" title="如果您要发送多个附件,您只需多次点击“继续添加附件”"
οnclick="AddAttachments();" href="javascript:;" name="attach">添加附件</a>
样式样子如下:
在需要时,附件中的功能配合JS代码,点击添加附件,就会一条条的增加附件录入框。
附: NEWSEDIT.ASPX(新闻编辑页面):
此页面为一个新闻LIST的编辑页面,里面有一条条的新闻显示,然后有一个编辑的链接到NEWS.ASPX页面,并传送一个PK_ID的参数过去。
NEWS.ASPX.CS:
Page_Load()方法:
if (!IsPostBack)
{
string pk_id = Request.Params["pk_id"]; //接收别的页面传来的参数
this.HF_pk_id.Value = pk_id; //把参数保存到一个隐藏控件上
InitPage(pk_id); //根据参数初始化页面
}
//初始化方法
public void InitPage(string pk_id)
{
if (!string.IsNullOrEmpty(pk_id))
{
DataTable dt = new DataTable();
string sql = string.Format("select * from test_news where pk_id='{0}'", pk_id);
dt = dbHelpSql.Query(sql); //dbHelpSql为自定义数据库方法类
if (dt != null && dt.Rows.Count > 0)
{
txt_title.Text = dt.Rows[0]["title"].ToString();
byte[] content_b = (byte[])dt.Rows[0]["content"];
txt_nr.Text = Encoding.GetEncoding("gb2312").GetString(content_b);
string fj = dt.Rows[0]["fj"].ToString().Replace("$", ";");
lblFJ.Text = fj;
}
}
}
//保存
protected void btn_save_Click(object sender, EventArgs e)
{
OracleHelper oracle = new OracleHelper(); //OracleHelper为数据库操作类
string pk_id = this.HF_pk_id.Value; //从隐藏控件获得PK_ID
string title = this.txt_title.Text.Trim();
string content = this.txt_nr.Text.Trim();
//内容
int contentLen = content.Length;
byte[] content_b = new byte[contentLen];
content_b = Encoding.GetEncoding("gb2312").GetBytes(content);
StringBuilder strBuilder = new StringBuilder();
string insql;
//图片
string filePath = "";
for (int i = 0; i < Request.Files.Count; i++)
{
if (Request.Files[i].ContentLength > 0)
{
filePath = Request.Files[i].FileName;
string sFile = filePath.Substring(filePath.LastIndexOf("//") + 1); //获得上传的文件名,带后缀
string newFile = GetNewFileName(sFile); //给上传的附件重新命名
if (checkFileType(sFile))
{
HttpPostedFile pathFile = Request.Files[i];
pathFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath("uploads/") + newFile);
string sfilename = newFile + "$";
strBuilder.Append("" + sfilename + "");
}
else
{
Response.Write("<script>alert('只能上传jpg,bmp,gif图片文件或.doc,xls格式的文件');location.replace(location.href)</script>");
return;
}
}
}
string fj = strBuilder.ToString();
if (string.IsNullOrEmpty(pk_id))
{
insql = "insert into yj_news(pk_id, type, title, content,fbsj,fj,fbr)values(SEQ_NEWS.Nextval,:type,:title, :content,:fbsj,:fj,:fbr)";
oracle.AddParmeter("type", DbType.String, type);
oracle.AddParmeter("title", DbType.String, title);
oracle.AddParmeter("fbsj", DbType.DateTime, fbsj);
oracle.AddParmeter("content", OracleType.Blob, content_b);
oracle.AddParmeter("fj", DbType.String, fj);
oracle.AddParmeter("fbr", DbType.String, fbr);
}
else
{
//在编辑新闻时,如果原先有图片附件,再次上次的话,就会把原先的图片全部删掉,再重新上传新的。
if (!string.IsNullOrEmpty(fj))
{
string sql = string.Format("select * from yj_news where pk_id='{0}'", pk_id);
DataTable newsdt = dbHelpSql.Query(sql);
if (newsdt.Rows.Count > 0)
{
string fjname = newsdt.Rows[0]["fj"].ToString();
for (int i = 0; i < fjname.Split(new char[] { '$' }).Length - 1; i++)
{
string sPath = "uploads/" + fjname.Split(new char[] { '$' })[i];
File.Delete(Server.MapPath(sPath).ToString());
}
}
insql = string.Format(@"update yj_news set type =:type, title =:title, content = :content,fj =:fj, fbr = :fbr where pk_id = :pk_id");
oracle.AddParmeter("fj", DbType.String, fj);
}
else
{
insql = string.Format(@"update yj_news set type =:type, title =:title, content = :content,fbr = :fbr where pk_id = :pk_id");
}
oracle.AddParmeter("type", DbType.String, type);
oracle.AddParmeter("title", DbType.String, title);
oracle.AddParmeter("content", OracleType.Blob, content_b);
oracle.AddParmeter("fbr", DbType.String, fbr);
oracle.AddParmeter("pk_id", DbType.Int32, pk_id);
}
try
{
oracle.ExecuteNonQuery(insql);
Response.Write("<script>alert('录入成功');location.replace(location.href)</script>");
}
catch (Exception)
{
Response.Write("<script>alert('录入出现问题');location.replace(location.href)</script>");
}
}
//检查文件类型
public bool checkFileType(string filename)
{
string ext = Path.GetExtension(filename);
switch (ext.ToLower())
{
case ".jpg":
case ".bmp":
case ".jpeg":
case ".doc":
case ".docx":
case ".xls":
case ".xlsx":
return true;
default:
return false;
}
}
// 生成新文件名
public static string GetNewFileName(string oldFileName)
{
string time = DateTime.Now.ToString("yyyyMMddhhmss");
//123.jpg 取123
string name = Path.GetFileNameWithoutExtension(oldFileName);
//后缀名
string ext = Path.GetExtension(oldFileName);
string newName = name + "(" + time + ")" + ext;
return newName;
}
NEWSDETAILS.ASPX(新闻展示页面):
//初始化页面
public void InitPage(DataTable dt, string type)
{
if (dt != null && dt.Rows.Count > 0)
{
Literal_Title.Text = dt.Rows[0]["title"].ToString();
byte[] content_b = (byte[])dt.Rows[0]["content"];
Literal_Content.Text = Encoding.GetEncoding("gb2312").GetString(content_b);
string fj = dt.Rows[0]["fj"].ToString();
if (!string.IsNullOrEmpty(fj) && fj != "")
{
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < fj.Split(new char[] { '$' }).Length - 1; i++)
{
string fjname = fj.Split(new char[] { '$' })[i];
if (type == "通知附件等")
{
strBuilder.AppendFormat("<a href=/"uploads/{0}/"><img alt=/"/" src=/"../img/wlink.bmp/" border=/"0/"/>附件下载</a>", fjname);
}
else if(type=="图片")
{
strBuilder.AppendFormat("<img alt=/"图片/" name=/"link/" src=/"uploads/{0}/" style=/"width: 450px;height: 300px; cursor: pointer/" /> <br>", fjname);
}
}
}
}
}
附:String对象的Split方法:
// 返回的字符串数组包含此实例中的子字符串(由指定 Unicode 字符数组的元素分隔)。
// 参数:
// separator:
// 分隔此实例中子字符串的 Unicode 字符数组、不包含分隔符的空数组或 null。
// 返回结果:
// 一个数组,其元素包含此实例中的子字符串,这些子字符串由 separator 中的一个或多个字符分隔。