原本以为很简单的一个小功能,没想到也花了一点时间去磨了几下。遇到问题当然是先www.g.cn一下,然而所找到的结果都是将数据操作写在页面的后台。这样对于整个Solution尤其是分了几层的解决方案来说,要把数据库操作搞到页面上去是不太可取之处的吧。
特别感谢网友 爱在戏院前,提醒可以用json的模式去把前头的字符拼出来,返回个字符串回去就可以了。
做幻灯片效果也的确是这样:要么就是用XML做数据源,要么就把从数据库中读取到的参数值传到FlashVar中,实现显示效果。
说明一下:我这里用到的是一个最常用的一种效果
截图:
文件:
一个前台显示的AD.SWF
逻辑层中的代码:
/// <summary>
/// 显示图片新闻列表
/// </summary>
/// <param name="PageSize">每页纪录数</param>
/// <param name="PageIndex"></param>
/// <returns></returns>
public IList<Model.NewsInfo> PicNewsList(int PageSize, int PageIndex)
{
SqlParameter[] parameters =
{
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@strGetFields", SqlDbType.VarChar, 1000),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@doCount", SqlDbType.Bit),
new SqlParameter("@OrderType", SqlDbType.Bit),
new SqlParameter("@strWhere", SqlDbType.VarChar, 1500)
};
parameters[0].Value = "Njsq_News";
parameters[1].Value = "*";
parameters[2].Value = "NewsID";
parameters[3].Value = PageSize;
parameters[4].Value = PageIndex;
parameters[5].Value = 0;
parameters[6].Value = 1;
parameters[7].Value = "NewsIndexPicPath IS NOT NULL";
try
{
IList<Model.NewsInfo> newsList = new List<Model.NewsInfo>();
Model.NewsInfo objNews = new NewsInfo();
using (SqlDataReader dr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringProfile, CommandType.StoredProcedure, "UP_GetCollectionPage", parameters))
{
while (dr.Read())
{
newsList.Add(Populater(dr));
}
}
return newsList;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 返回UI层的幻灯片字符串
/// </summary>
/// <returns></returns>
public static string PicNews()
{
IList<Model.NewsInfo> list = new List<Model.NewsInfo>();
BLL.News bllNews = new News();
list = bllNews.PicNewsList(5, 1); //调用上面的Method()
StringBuilder retStr = new StringBuilder();
StringBuilder retPics = new StringBuilder();
StringBuilder retTitle = new StringBuilder();
StringBuilder retLinks = new StringBuilder();
string pics = "NewsCoverPic/"; //定义图片的路径,我这里是写死了,你可以设置成一个变量
string title = string.Empty; //幻灯片中的新闻标题
string links = "News/NewsDetail.aspx?NID="; //幻灯片中的链接格式
for (int i = 0; i < list.Count; i++) //循环,
{
retPics.Append(pics).Append(list[i].NewsIndexPicPath.ToString()).Append("|"); //将图片路径获取后使用append()将图片路径串成一个字符串
retTitle.Append(list[i].NewsTitle).Append("|"); //将标题获取后使用append()串成一个字符串
retLinks.Append(links).Append(list[i].NewsID.ToString()).Append("|");//将链接格式及新闻参数ID获取后串成一个长字符串
}
string retString="pics=" + retPics.ToString() + "&links=" + retLinks.ToString() + "&texts=" + retTitle.ToString() + "&borderwidth=340&borderheight=240&textheight=20"; //将retpics,rettitle,rettitle连成一个长字符串
retStr.Append(retString.ToString());
return retString.ToString(); //返回前台Flash所需的一个FlashVar的参数值
}
说明一下:
大家可以看到我这里有些参数值是写死了,比如一些borderwith borderheight之流的,因为考虑到这些在实际运用过程上变化的因素不是很大,如果确实有这个必要从前端UI进行设置的话,可以将其作为变量值传送。当然,如果要扩充整个功能:建议是将在前端Flash的参数,整成一个object的属性,直接传一个实体到后台就行了。
再来看看前台的:javascript
因为后台的类是static模式,所以我们在前台调用就很方便了.
FlashVars="<%=BLL.News.PicNews() %>" 而我在前台页面的.cs(default.aspx.cs)中,没有添加任何代码
完整的javascript代码
<script type="text/javascript">
document.write('<embed src="Flash/ad.swf" wmode="opaque" FlashVars="<%=BLL.News.PicNews() %>" menu="false" bgcolor="#DAF3CE" quality="high" width="340" height="260" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"/>');
</script>
这样就达到我们所需要的效果了,不过很奇怪的是这个只能接受jpg类型的图,算是一个bug吧.
除了FlashVars这个属性,像其它Menu bgColor width height 之类的,都可以作为参数传,怎么传就不用我来啰嗦了。
对比一下网上同行的实现模式:
附:CSDN上的一个源码程序(新浪新闻图片实现效果)
点击下载此文件
看了一下它实现的代码:
private void Flash()
{
SqlConnection con = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["con"]);
con.Open();
SqlDataAdapter sda = new SqlDataAdapter("select * from flash order by createdate Desc ", con);
DataSet ds = new DataSet();
sda.Fill(ds, "flash");
DataView dv = ds.Tables[0].DefaultView;
if(dv.Table.Rows.Count != 0)
{
for (int i = 0; i < dv.Table.Rows.Count; i++)
{
flashAdd += dv.Table.Rows[i]["FlashHref"].ToString() + "|";
flashUrl += dv.Table.Rows[i]["FlashUrl"].ToString() + "|";
}
flashAdd = flashAdd.Substring(0, flashAdd.LastIndexOf("|"));
flashUrl = flashUrl.Substring(0, flashUrl.LastIndexOf("|"));
}
个人认为,除非用在比较简单的一些小网站中,要不其实际运用是不提倡这样的方法的吧。这只是个人之见哈。本文来源:http://www.dezai.cn/blog/article.asp?id=211
一点小经验,与大家分享,欢迎多多指教, 再次感谢网友爱在戏院前。
特别感谢网友 爱在戏院前,提醒可以用json的模式去把前头的字符拼出来,返回个字符串回去就可以了。
做幻灯片效果也的确是这样:要么就是用XML做数据源,要么就把从数据库中读取到的参数值传到FlashVar中,实现显示效果。
说明一下:我这里用到的是一个最常用的一种效果
截图:
文件:
一个前台显示的AD.SWF
Flash动画
逻辑层中的代码:
程序代码
/// <summary>
/// 显示图片新闻列表
/// </summary>
/// <param name="PageSize">每页纪录数</param>
/// <param name="PageIndex"></param>
/// <returns></returns>
public IList<Model.NewsInfo> PicNewsList(int PageSize, int PageIndex)
{
SqlParameter[] parameters =
{
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@strGetFields", SqlDbType.VarChar, 1000),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@doCount", SqlDbType.Bit),
new SqlParameter("@OrderType", SqlDbType.Bit),
new SqlParameter("@strWhere", SqlDbType.VarChar, 1500)
};
parameters[0].Value = "Njsq_News";
parameters[1].Value = "*";
parameters[2].Value = "NewsID";
parameters[3].Value = PageSize;
parameters[4].Value = PageIndex;
parameters[5].Value = 0;
parameters[6].Value = 1;
parameters[7].Value = "NewsIndexPicPath IS NOT NULL";
try
{
IList<Model.NewsInfo> newsList = new List<Model.NewsInfo>();
Model.NewsInfo objNews = new NewsInfo();
using (SqlDataReader dr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringProfile, CommandType.StoredProcedure, "UP_GetCollectionPage", parameters))
{
while (dr.Read())
{
newsList.Add(Populater(dr));
}
}
return newsList;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 返回UI层的幻灯片字符串
/// </summary>
/// <returns></returns>
public static string PicNews()
{
IList<Model.NewsInfo> list = new List<Model.NewsInfo>();
BLL.News bllNews = new News();
list = bllNews.PicNewsList(5, 1); //调用上面的Method()
StringBuilder retStr = new StringBuilder();
StringBuilder retPics = new StringBuilder();
StringBuilder retTitle = new StringBuilder();
StringBuilder retLinks = new StringBuilder();
string pics = "NewsCoverPic/"; //定义图片的路径,我这里是写死了,你可以设置成一个变量
string title = string.Empty; //幻灯片中的新闻标题
string links = "News/NewsDetail.aspx?NID="; //幻灯片中的链接格式
for (int i = 0; i < list.Count; i++) //循环,
{
retPics.Append(pics).Append(list[i].NewsIndexPicPath.ToString()).Append("|"); //将图片路径获取后使用append()将图片路径串成一个字符串
retTitle.Append(list[i].NewsTitle).Append("|"); //将标题获取后使用append()串成一个字符串
retLinks.Append(links).Append(list[i].NewsID.ToString()).Append("|");//将链接格式及新闻参数ID获取后串成一个长字符串
}
string retString="pics=" + retPics.ToString() + "&links=" + retLinks.ToString() + "&texts=" + retTitle.ToString() + "&borderwidth=340&borderheight=240&textheight=20"; //将retpics,rettitle,rettitle连成一个长字符串
retStr.Append(retString.ToString());
return retString.ToString(); //返回前台Flash所需的一个FlashVar的参数值
}
说明一下:
大家可以看到我这里有些参数值是写死了,比如一些borderwith borderheight之流的,因为考虑到这些在实际运用过程上变化的因素不是很大,如果确实有这个必要从前端UI进行设置的话,可以将其作为变量值传送。当然,如果要扩充整个功能:建议是将在前端Flash的参数,整成一个object的属性,直接传一个实体到后台就行了。
再来看看前台的:javascript
因为后台的类是static模式,所以我们在前台调用就很方便了.
FlashVars="<%=BLL.News.PicNews() %>" 而我在前台页面的.cs(default.aspx.cs)中,没有添加任何代码
完整的javascript代码
程序代码
<script type="text/javascript">
document.write('<embed src="Flash/ad.swf" wmode="opaque" FlashVars="<%=BLL.News.PicNews() %>" menu="false" bgcolor="#DAF3CE" quality="high" width="340" height="260" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"/>');
</script>
这样就达到我们所需要的效果了,不过很奇怪的是这个只能接受jpg类型的图,算是一个bug吧.
除了FlashVars这个属性,像其它Menu bgColor width height 之类的,都可以作为参数传,怎么传就不用我来啰嗦了。
对比一下网上同行的实现模式:
附:CSDN上的一个源码程序(新浪新闻图片实现效果)
点击下载此文件
看了一下它实现的代码:
程序代码
public string flashUrl = "";
public string flashAdd = "";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Flash();
}
}
public string flashAdd = "";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Flash();
}
}
程序代码
private void Flash()
{
SqlConnection con = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["con"]);
con.Open();
SqlDataAdapter sda = new SqlDataAdapter("select * from flash order by createdate Desc ", con);
DataSet ds = new DataSet();
sda.Fill(ds, "flash");
DataView dv = ds.Tables[0].DefaultView;
if(dv.Table.Rows.Count != 0)
{
for (int i = 0; i < dv.Table.Rows.Count; i++)
{
flashAdd += dv.Table.Rows[i]["FlashHref"].ToString() + "|";
flashUrl += dv.Table.Rows[i]["FlashUrl"].ToString() + "|";
}
flashAdd = flashAdd.Substring(0, flashAdd.LastIndexOf("|"));
flashUrl = flashUrl.Substring(0, flashUrl.LastIndexOf("|"));
}
个人认为,除非用在比较简单的一些小网站中,要不其实际运用是不提倡这样的方法的吧。这只是个人之见哈。本文来源:http://www.dezai.cn/blog/article.asp?id=211
一点小经验,与大家分享,欢迎多多指教, 再次感谢网友爱在戏院前。