原本以为很简单的一个小功能,没想到也花了一点时间去磨了几下。遇到问题当然是先www.g.cn一下,然而所找到的结果都是将数据操作写在页面的后台。这样对于整个Solution尤其是分了几层的解决方案来说,要把数据库操作搞到页面上去是不太可取之处的吧。

特别感谢网友 爱在戏院前,提醒可以用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();
        
        }
    }


程序代码 程序代码

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



一点小经验,与大家分享,欢迎多多指教, 再次感谢网友爱在戏院前。


posted on 2008-08-29 01:19  德仔  阅读(4054)  评论(3编辑  收藏  举报