整理了"培练营"课程中同学们的提问和老师的精彩解答

ntwuhaohao 2008-10-25 01:17:14
加精
花了一下午时间,把两个月来"培练营"中学习的学员们的提问和老师的解答都整理出来,希望对大家有所帮助,少走些弯路

注:我整理的是以经结贴的提问,对于未结贴的,普遍来说质量不高,而且也没这么多时间,请大家谅解,课程老师贴过一个精华贴的集锦,但内容很少,大家也可以看看。

学员:Mlive
金老师,我在发布网站后出下了下面的错误提示,请帮我解答一下啊!
Directory Listing Denied
This Virtual Directory does not allow contents to be listed
回答人:金旭亮
出错信息的含义是“没有浏览目录的权限”。
可能的出错原因是:
你没有给网站指定默认主页(或者你删除了Default.aspx)网页,而又没有在IIS管理器中给网站授予“浏览目录”的权限。
解决方法是:
在IIS管理器中选中网站节点,右击,选“属性”命令,找到“默认文档”卡片,在列表框中添加“Default.aspx”(IIS5/IIS6)
IIS 7中可以直接在网站的“功能视图”中看到“默认文档”图标,双击它即可在窗口中找到命令链接添回“Default.aspx”。
如果是所有ASP.NET网站都不正常,需到“C:\Windows\Microsoft.NET\Framework\v2.0.50727”文件夹下运行aspnet_regiis.exe -i 修复ASP.NET.
学员:fangfangok
if ((p.Direction == ParameterDirection.Input || p.Direction == ParameterDirection.InputOutput) && p.Value == null)
{
p.Value = DBNull.Value;
}
这句话不明白它的作用。我试了一下,去了后也不会出现错误。为什么要添上这句,有什么作用呢
回答人:amandag(高歌 .NET学习顾问)
如果参数为输入参数或者为输入输出参数,并且参数的值为null,则给其赋值为System.DBNull.Value
这里需要知道的是,对于我们应用程序中的null与数据库的null值不是一个概念,给数据库的值赋null值需要赋值System.DBNull.Value,取值也是这样
在我们的程序中不加这句话也没出错的原因是,就目前为止,我们传递给数据库的参数没有传过null值,你可以在程序中直接传个null值,再注释掉这两句代码看看是什么效果
学员:fangfangok
try
{
if (con.State == ConnectionState.Closed)
con.Open();
SqlCommand cmd = new SqlCommand(sql, con);
return cmd;
}
catch (SqlException ex)
{
throw ex;
}
不太明白throw ex这句,它的作用,
我在try中故意写错了连接字符串中的用户登录密码,但是还是提示用户登录失败,没有像以前用vb那种,messagebox.show(ex),这样子,弹出对话框提示,失败
回答人:amandag(高歌 .NET学习顾问)
在catch块里写 throw ex其实是继续将异常抛出,也就是说调用者需要继续处理这个异常,如果不想调用者处理这个异常,可以return null或者什么都不写
catch (SqlException ex)
{
return null; //调用者仍然需要根据返回值进行判断
}
catch (SqlException ex)
{
//不对异常做任何处理,调用者仍然需要根据返回值进行判断
}
学员:fangfangok
田老师为什么要这样分开写?
sql.Append("select count(*) from userinfo where ");
sql.Append(where);
直接写在一起:
sql.Append("select count(*) from userinfo where "+where);
这样子不可以吗?
回答人:amandag(高歌 .NET学习顾问)
楼主首先要了解StringBuilder类和String类的不同,StringBuilder类表示的是可变字符字符串,而String表示的是不可改变的字符串
所以如果你用了"select count(*) from userinfo where "+where,实际上在内存当中还是会生成"select count(*) from userinfo where "这个字符串和你的where变量代表的字符串,还有 "select count(*) from userinfo where "加上where变量代表的字符串所生成的新的字符串。而使用StringBuilder类的Append方法则做的是个追加,就不会生成这么多的临时字符串。
了解了这个,就能知道就结果而言用上面两种方式都一样,但从效率上显然第一种更好
学员:陈树钦
田老师啊
如果用存储过程来插入数据的话,我认为就不需要把TEXTBOX的值Server.EnHtml了吧。因为我认为这样不太可能SQL的注入的吧。
如果是用字符串拼接的话,例如:insert into [tables](###,###) values('+string之类的+','+string之类的+')如果这样的写的话,string之类的是TEXTBOX的值,别人会怎么注入啊。老师们最好能给个详细的例子啊。知道攻击方法才能好的防范啊
回答人:amandag(高歌 .NET学习顾问)
如果用存储过程来插入数据的话,我认为就不需要把TEXTBOX的值Server.EnHtml了吧。因为我认为这样不太可能SQL的注入的吧。
==
1. 应该是Server.HtmlEncode吧
2.需要对输入进行编码的一个原因是,现在的项目既然是分层的,你怎么能肯定写数据访问层的人就一定用的是存储过程呢?
3. 程序员杂志2008年7月有一篇讲SQL注入的文章,楼主可看看
学员:陈树钦
请金老师指教啊,谢谢
第一种情况:在一个类中定义了一个属性,它可以返回对DataSet实例的引用。DataSet的实例通过GetDs()方法获取,
用户访问页面的时候,会实例化一个该类的对象,然后通过该属性来获取到DataSet并绑定到页面。这时,如果有多个用户
同时访问页面,服务器内存中是不是有多个DataSet实例?
第二种情况:如果第二种情况中的类是个静态类,所以不需要实例化就可以在页面中获取到对DataSet的引用,然后绑定到页面
。在这种情况下,如果有多个用户访问页面,服务器内存中的DataSet情况如何? 写的不清楚第二种情况,就是这次GetDs()是这样的 public static SqlDataSet(……){…………;return SqlDataSet}出来,在页面直接通过静态调用
回答人:amandag(高歌 .NET学习顾问)
第一种情况:在一个类中定义了一个属性,它可以返回对DataSet实例的引用。DataSet的实例通过GetDs()方法获取,
用户访问页面的时候,会实例化一个该类的对象,然后通过该属性来获取到DataSet并绑定到页面。这时,如果有多个用户
同时访问页面,服务器内存中是不是有多个DataSet实例?
==
是的,除非你把DataSet放到了Cache中,其他用户是从Cache中取数据
第二种情况:如果第二种情况中的类是个静态类,所以不需要实例化就可以在页面中获取到对DataSet的引用,然后绑定到页面
。在这种情况下,如果有多个用户访问页面,服务器内存中的DataSet情况如何?
写的不清楚第二种情况,就是这次GetDs()是这样的 public static SqlDataSet(……){…………;return SqlDataSet}出来,在页面直接通过静态调用
==
首先这个方法只能是这样的
public static DataSet GetDS()
{
...
return myDataSet;
}
没有SqlDataSet这样的类,因为DataSet与具体的数据库无关
如果你的方法是这样写的
public static class DSDemo
{
public static DataSet ds = null;
public static DataSet GetDS()
{
if (ds == null)
{
ds = new DataSet();
//这里填充ds
}
return ds;
}
}
那么这个DataSet对象ds在Web服务器中只有一个
如果是下面这样
public static class DSDemo
{
public static DataSet GetDS()
{
DataSet ds = new DataSet();

//这里填充ds
return ds;
}
}
那么每次调用方法都会生成新的DataSet 对象
学员:隋亮亮
我看了整个课程的介绍,我发现主要是讲web项目的开发,如果我想做桌面版的程序,用web版的知识可不可以完成啊?
回答人:polarstar (.NET学习顾问)
第一阶段会涉及到桌面程序
除了Web专用到的一些类或命名空间(例如,Session、System.Web)之外,Web版的后台功能代码(.cs文件里面的代码)是和窗体程序一样的,学习过Web知识后,只要稍微花点时间就可以在编写桌面程序,当然最好还要了解桌面程序特别用到的类的使用,例如,Timer控件。他们之间有些是可以通用的,例如数据库访问的类System.Data下面的东西。有些不是,例如上面提到的。熟练了就好了。
学员:ntwuhaohao
在事件示例代码中,经常看到这样
//定义一个委托
public delegate void ValueChanged(String value);
//自定义一个事件
public event ValueChanged ButtonClicked;
我想问的事,自定义事件时必须要先定义委托吗?这两者有什么具体紧密的关系?单独定义事件是否可行?
看了好几遍视频依然对委托和事件不太明白,特别是对两者的综合应用。不知道我的问题表述是否清晰
回答人:polarstar (.NET学习顾问)
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。
由于事件的处理是通过函数来完成的,而函数的签名是通过委托声明来体现的,即在还不知道使用哪个函数来处理的情况下,先用委托来声明它的参数、返回值,以后关联处理函数必须是有相同参数和返回值的。
在.net中,事件的类型必须是委托。但是以前VB的事件处理时并没有委托,它通过Public Event Click()可以定义一个事件,通过函数后面加Handles Button1.Click表示这个函数处理Click事件。VB.net好像还保留这个写法,但是新的写法也是可以的。所以我们还是认为使用事件必须先定义委托吧。
event还有个作用就是,它只能使用+=和-=来关联处理的函数和取消关联,为什么这样呢?因为这样就不会覆盖前面已经关联的函数。如果它可以用=来关联,那就表名处理函数只能是一个了,实际上处理函数可以是多个,也就是事件发生时可能多个函数被调用。
通俗的讲法:
事件就是某件事发生了,例如,猫叫,这就是个事件;委托就是具有响应响应事件的工具,例如耳朵;事件处理函数就是具体事务对事件的反应,例如老鼠的耳朵听见了“喵”它就跑了,这就是老鼠这个具体对象对事件的处理。呵呵,你可以用面向对象写几个类来表示他们的关系。
学员:徐豫锋
1、能不能详细讲一下cookie
服务器读cookie时用Request.cookies["UserName"]
服务器写cookie时用Response.cookies["UserName"]
为什么,读用Request,写用Response,是否详细讲一下?
2、cookie到底是什么,存在何处,如何交互?
能提供详细描述,cookie和Request、Response的文档吗
回答人:polarstar (.NET学习顾问)回答时间:2008-09-06 19:13:06
Request对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时,客户端提供的全部信息。这包括能指明浏览器和用户的HTTP变量,在这个域名下存放在浏览器中的cookie,任何作为查询字符串而附于URL后面的字符串或页面的<FORM>段中的HTML控件的值。也提供使用Secure Socket Layer(SSL)或其他加密通信协议的授权访问,及有助于对连接进行管理的属性。
Response对象:用来访问服务器端所创建的并发回到客户端的响应信息。为脚本提供HTTP变量,指明服务器和服务器的功能和关于发回浏览器的内容的信息,以及任何将为这个域而存放在浏览器里新的cookie。它也提供了一系列的方法用来创建输出,例如无处不在的Response.Write方法。
cookie: Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。 当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
讲的通俗一点就是:
Request(中文“请求”的意思):可以理解为客户端向服务器请求的信息,就是客户端向服务器请求时,把自己的浏览器信息、HTTP变量和保存在客户端的Cookie告诉服务器,这样服务器就可以根据这些信息判断是谁请求的,之前有没有请求过,对应客户端的Session是什么等等。
Response(中文“反应、响应”的意思):可以理解为服务器对客户端请求的响应,就是服务器接收到客户端的请求后,成生页面信息、Cookie(发到客户端后就保存在客户端)等发送到客户端。
Cookie(中文“饼干”,在这里不能这样理解了):就是保存在客户端上的一些信息,可以用来验证用户信息,提高用户响应速度等等。为何不把它理解为:我把饼干放在家里,我想吃的时候就拿出来吃。呵呵!
学员:陈健
用Form1代替老师课堂举例的this,为什么出错呢?
namespace DrawOnControl
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnDrawOnForm_Click(object sender, EventArgs e)
{
Graphics g = Form1.CreateGraphics();
g.DrawEllipse(Pens.Red, Form1.ClientRectangle);
g.Dispose();
}
private void btnDrawOnControl_Click(object sender, EventArgs e)
{
Graphics g = richTextBox1.CreateGraphics();
g.DrawEllipse(Pens.Red, richTextBox1.ClientRectangle);
g.Dispose();
}
}
}
回答人:polarstar (.NET学习顾问)回答时间:2008-09-11 12:49:58
只有静态变量、属性、方法,常量才可以通过类名直接引用,因为他们是和具体对象无关的,是类“共享”的,所以可以通过类名来引用,否则就要通过具体对象来引用了。例如:
public class A
{
public static int num;
public static void dosomething(){}
public const string name="A"
public int count;
}
以下引用是正确的:
int n1 = A.num;
A.dosomething();
string s=A.name;
A a = new A();
int c = a.count;
回答人:amandag(高歌 .NET学习顾问)
原因很简单,Form1是个类,而this指代当前对象,因为类和对象本身就不是一回事,当然不能这样替代使用
这就正如this(我)是一个具体的人,但我不能用我来代替人类这个概念
...全文
596 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
小童012 2008-12-15
  • 打赏
  • 举报
回复
顶,珍惜劳动果实,谢谢,收藏了
mxx0070 2008-12-07
  • 打赏
  • 举报
回复
看看
fescort 2008-11-20
  • 打赏
  • 举报
回复
MARK
taolanjian 2008-11-04
  • 打赏
  • 举报
回复
mark!
bell791002 2008-10-27
  • 打赏
  • 举报
回复
同意楼上的观点,整理这些资料真的挺不容易的。
多谢楼主。
lxj1234567 2008-10-27
  • 打赏
  • 举报
回复
顶,把这mark下回去好好看下。谢谢楼主的整理,辛苦了。
SpeForce 2008-10-26
  • 打赏
  • 举报
回复
有用
ziqing_deshi 2008-10-26
  • 打赏
  • 举报
回复
学习了
三下鱼 2008-10-26
  • 打赏
  • 举报
回复
另外,看见楼主整理出这些材料,也不容易,希望大家就不要只回帖些“o”,"哦",“恩”这些不同不痒的回帖了吧!
三下鱼 2008-10-26
  • 打赏
  • 举报
回复
楼主整理辛苦
krockk 2008-10-26
  • 打赏
  • 举报
回复
顶了!
ljie8834 2008-10-25
  • 打赏
  • 举报
回复
yhy0611 2008-10-25
  • 打赏
  • 举报
回复
怎么好多都是WEB相关,不喜欢
亦风亦尘 2008-10-25
  • 打赏
  • 举报
回复
o
Tomato77 2008-10-25
  • 打赏
  • 举报
回复
Tomato77 2008-10-25
  • 打赏
  • 举报
回复

2,089

社区成员

发帖
与我相关
我的任务
社区描述
在线培训学习经验交流分享、优质课程资源共享。
社区管理员
  • IT课程大本营社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧