4.28
FileUpload不能用脚本触发click事件,是基于安全的考虑。搞了这么久的newsEdit页面报废了。以后尽量还是从网上找一些现成的代码,然后再弄吧。不是现成的代码,可能做一段时间后发现这个方法在实现上不可行。
News类中有好多string类型的变量,NewsAttach1到NewsAttach15,在程序中需要通过数字(1~15)使用这些变量的值或给这些变量赋值,
第一次做的尝试是GetAttach(News news,int n,out string newsattach),在函数中给newsattach赋予news.NewsAttach(一个数字),
不可行,因为C#中string是引用类型,但是进行赋值的时候,会在托管堆中重新分配一个新的空间存放新值。
ckeditor使用的问题------
配置:
1、Web中的bin文件夹下添加CKEditor.NET.dll,也可以通过右击Web网站解决方案,添加引用,选择它。
2、将“\_Samples”文件夹下的“ckeditor”文件夹,添加到网站根目录。
可以精简里面的内容,比如,lang下只保留en.js zh.js zh-cn.js,skins下只保留v2文件夹。
3、在config.js里面进行个性化配置
config.skin = 'v2';
config.resize_enabled = false;
config.toolbar =
[
['Bold', 'Italic', 'Underline', 'Strike', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink'],
['Cut', 'Copy', 'Paste', '-', 'Find', 'Replace'],
['Styles', 'Format', 'Font', 'FontSize', '-', 'TextColor', 'BGColor']
];
config.font_names='宋体/宋体;黑体/黑体;仿宋/仿宋_GB2312;楷体/楷体_GB2312;隶书/隶书;幼圆/幼圆;微软雅黑/微软雅黑;';
4、防止出现“从客户端(editor="<p>This is some <...")中检测到有潜在危险的 Request.Form 值。”这种问题,需要
1)在使用ckeditor插件的页面上方加入这个属性,<%@ Page ValidateRequest="false" %>
2)在webconfig里面加入<httpRuntime requestValidationMode="2.0"/>(VS2010使用asp.net 4.0,请求验证处理机制会使第一条失效,所以还要进行这个修改)
ASP.net前台:
head中 <script type="text/javascript" language="javascript" src="http://www.cnblogs.com/ckeditor/ckeditor.js"></script> body中 <asp:TextBox ID="TextBoxNewsContent" runat="server" TextMode="MultiLine" Width="840px" Height="150px" ontextchange="textChange();" ></asp:TextBox> <script type="text/javascript"> var editor=CKEDITOR.replace('<%=TextBoxNewsContent.ClientID %>'); </script>
JavaScript获取:
function beforePost() { var obj = document.getElementById("TextBoxNewsTitle"); if (obj.value.length == 0) { alert("新闻标题不能为空!"); obj.focus(); return false; } //editor.document.getBody().getText()取得纯文本 //editor.document.getBody().getHtml()取得html文本 if (editor.document.getBody().getText() == "") { alert("新闻内容不能为空!"); return false; } return true; }
ASP.net后台:
取得html文本:直接使用news.NewsContent=TextBoxNewsContent.Text;
将html文本赋给textbox也直接使用TextBoxNewsContent.Text=news.NewsContent;
4.29
在aspx.cs的代码中,可以直接使用Server.MapPath函数,但是在.cs的类文件中,不能如此使用,应使用System.Web.HttpContext.Current.Server.MapPath,aspx页面后台代码默认添加了这个httpcontext.current引用。
mysql中日期函数year(NewsDate)返回年份,month(NewsDate)返回月份,dayofmonth(NewsDate)返回月份中日数。
mysql中比较datetime和另一个日期是否是同一天,用where to_days('1989-12-12')=to_days(NewsDate)
原本ajaxcontroltoolkit中的日历控件是英文的,但是在ToolkitScriptManager控件中加入EnableScriptGlobalization= "true"后,就可以按照windows系统的语言版本进行调整,中文版windows就是中文的日历。
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnableScriptGlobalization= "true"> </asp:ToolkitScriptManager>
尽量多的代码重用,这样再修改的时候,就可以仅修改一个地方,而不用每一处都进行修改。页面的重用,相同代码放到函数里面。
有些时候,遇到的问题,不好解决,可以先放放,像考试中遇到难题留到最后一样。到了后来,可能自己的能力提供了,问题就迎刃而解了。这次项目之前遗留的问题都记录下来了,最后发现好多问题后来都解决了。
在head里面经常用到的css和js的引用,注意script引用有开始和结束标签<script></script>,写成<script />这种形式会使页面在vs2010里或在浏览器调试的时候不显示。
<link rel="Stylesheet" href="http://www.cnblogs.com/Styles/table.css" type="text/css"/>
<script type="text/javascript" src="http://www.cnblogs.com/Scripts/projinfo.js"></script>
web.config中配置session模式(mode)默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
1、服务器内存使用超过一定的限度,配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。。。等。。。
以上情况下,保存session的进程会重启,session丢失。我遇到的情况是,project中upload附件上传页面,删除最后一个附件后,(估计是因为同时删除了文件夹),session丢失。
所以改成<sessionState mode="StateServer" timeout="30"/>保存到“ASP.NET 状态服务”这个服务中。
需要在管理->服务中手动开启这个服务。
定期备份自己的工程,以防vss上的版本被较旧的文件覆盖或被被别人串改。
css中设置背景图片的语句:background-image:url(../Images/home/top_dh01.gif) ,图片url是相对css文件的相对地址,仅能用相对路径!!
4.30
tinyMCE使用的问题(比ckeditor加载速度快很多、功能稍弱)------
配置:
1、在官网下载tinymce最新版,下载tinymce_lang_pack.zip(汉语支持包),解压后将其中的内容与tinymce中的内容进行合并,并放到网站Scripts/目录下
2、将tiny_mce\themes\advanced\skins\default\content.css中的第一行改成
body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px; margin:8px;},
使字体由10px改成14px,解决字体默认太小的问题。
ASP前台:
<asp:TextBox ID="TextBoxNewsContent" TextMode="MultiLine" runat="server" onfocus='tinyMCEinit();' Width="800px" Height="300px"/> <asp:Button ID="ButtonPost" runat="server" Text="保存并发布" OnClientClick="return beforePost();"/>
JavaScript:
<script language="javascript" type="text/javascript"> function tinyMCEinit() { tinyMCE.init({ mode: "exact", elements: "TextBoxNewsContent", //对应下面的textbox的id theme: "advanced", //还可以是"simple" plugins: "pagebreak", theme_advanced_buttons1: "bold,italic,underline,separator,strikethrough,justifyleft,justifycenter,justifyright, justifyfull,bullist,numlist,fontsizeselect,backcolor,forecolor,undo,redo,", theme_advanced_buttons2: "", theme_advanced_buttons3: "", theme_advanced_toolbar_location: "top", theme_advanced_toolbar_align: "left", theme_advanced_path_location: "bottom", width: 800, //这里设置的是留言板的长宽 height: 350, extended_valid_elements: "a[name|href|target|title|onclick],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]", language: "ch" //这个设置按钮提示语为中文,很有用 }); } function beforePost() { var content = tinyMCE.get('TextBoxNewsContent').getContent(); if (content.length == 0) { alert('内容不能为空!'); return false; } return true; } </script>
后台:
直接使用TextBoxNewsContent.Text来获取,同ckeditor一样。
5.1
以后设计数据库表格的时候,尽量考虑全面,宁愿多存一些不太重要的信息,也不要保存的信息过少。
比如DownloadFile表格,不能只有一个id和filename,还应该有发布者、发布日期等等附属信息,以便实现用户不能删除不是自己发布的文件。
数据库中存东西,尽量都存主键,News信息表中NewsEditor如果存的是新闻发布者的名字,但是该用户改名了,就会使它无法修改自己的News;而且,其他用户只要将自己的UsrName改成其他用户的名字,就可以随意篡改别人的News。存string无非就是为了后台代码好写,直接单表查询并且写到页面的控件上就行了,但是这会带来逻辑错误,千万不可行。
GridView隐藏某一列,这一列可以用来存这一行信息的id。更好的实现方式是设置GridView的DataKeyNames属性,然后在后台用DataKeys获取保存的值
GridViewNewsManage.DataSource = newsManage.GetList("NewsType=0");
GridViewNewsManage.DataBind();
GridViewNewsManage.Columns[6].Visible = false;
GridView的模版列中加入按钮,触发按钮事件后,如何获取该行的某个值?
前台:
<asp:TemplateField> <ItemTemplate> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> </ItemTemplate> </asp:TemplateField>
后台:
protected void Button1_Click(object sender, EventArgs e) { Button btn = sender as Button; GridViewRow row = btn.Parent.Parent as GridViewRow; string a = row.Cells[0].ToString();//获得第一个单元格的值 string b = this.GridView1.DataKeys[row.DataItemIndex][0].ToString();//获得DataKeys的值 }
5.2
date_format(NewsDate,'%Y-%m-%d') mysql格式化输出函数 %Y年份,%m月份,%d月中的天数,使用:
select date_format(NewsDate,'%Y-%m-%d') from news where ...
以下css样式针对class属性为headline2的链接
.headline2 a { color: rgb(255, 255, 255); line-height: 135%; font-size: 14px; font-weight: bold; text-decoration: none; } .headline2 a:hover { color: rgb(255, 204, 0); text-decoration: underline; }
以下css样式设置图片的功能类似于button,鼠标移动上去会显示“手型”
<img src="../Images/homepage/more.gif" onclick="window.location='MoreDown.aspx'" style="cursor:pointer;">
GridView里设置 AllowPaging="true" PageSize="8",再在GridView中加入这个属性<PagerSettings Visible="false"/>,就可以分页但是不显示下面的跳转到第几页的按钮
script紧跟元素后面,因为js是按照从上到下的顺序执行的,如果放在head中会获取不到label这个元素(还没有渲染)
<asp:Label ID="LabelMydate" runat="server" Text=""></asp:Label>
<script type="text/javascript"> var today = new Date();//获取当前日期事件 var obj = document.getElementById('<%= LabelMydate.ClientID %>'); var d = new Array( "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
//today.toLocaleDateString()相当于(today.getYear()) + "年" + (today.getMonth() + 1) + "月" + today.getDate() + "日 " obj.innerHTML = '今天是 ' + today.toLocaleDateString() + d[today.getDay()]; </script>