1. ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释。
答:有三种,分别是集成Windows身份验证,表单Forms验证以及Passport,Forms验证是最常用的一种。
2. 什么是WEB控件?使用WEB控件有那些优势?
答:实现了System.Web.UI.WebControls这个命名空间的一些类。包括像ASP.NET服务器端控件,用户控件及自定义控件等。使用控件提高了复用性,可以获得更好的开发效率。
3.请解释ASP.NET中以什么方式进行数据验证?
答:Aps.net中有非空验证(RequiredFieldValidator),比较验证(CompareValidator),取值范围验证(RangeValidator),正则表达式验证(RegularExpressionValidator)及客户自定义验证(CustomValidator)五大控件,另还有一个集中验证信息处理控件(ValidationSummary)。
4.请谈谈对正则表达式的看法?
答:善用正则表达式可以高效的处理字符串。如查找匹配正则表达式的文本。
5.ASP.NET中共有几种类型的控件?各有什么区别?
答:按我理解,有普通HTML控件,HTML服务器控件(普通HTML控件加runat="server"标签),ASP.NET服务器控件,自定义控件,用户控件。
6.WEB控件可以激活服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动回传是什么?为什么要使用自动回传。
答:在web控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用Page_Load事件,然后根据传回的状态信息自动调用服务端事件。
自动传回是当我们在点击客户端的控件时,采用提交表单的形式将数据直接传回到务端。
只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务端事件。
7.WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
答:对于ASP.NET服务器端控件可以使用,ClientScriptManager的RegisterStartupScript等相关实例方法。这其中可以定义与客户端脚本交互的JavaScript。
8.ASP.NET与ASP相比有什么优势?
答:定义了一个WebForm模型,一定程度上提高了开发效率,另外编译执行的模式也提高了运行效率。
9.请解释web.config文件中的重要节点。
appSettings包含自定义应用程序设置。
connectionStrings:保存连接字符串(.Net2.0新增)
system.web 系统配置
compilation动态调试编译设置,如是否启用调适模式等。
customErrors自定义错误信息设置
authentication身份验证,此节设置应用程序的身份验证策略。
authorization授权, 此节设置应用程序的授权策略。
10.请解释ASP.NET中的web页面与其隐藏类之间的关系?
答:(针对ASP.NET2.0+)一个ASP.NET页面一般都对应一个代码隐藏文件,一般都在ASP.NET页面的声明中指定了代码隐藏文件。例如一个页面a.aspx的页面声明如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="a.aspx.cs" Inherits="a" %>
CodeFile="a.aspx.cs" 表明此页面使用的代码隐藏文件
Inherits="a" 表示此页面的类型的名称,这里使用了.NET2.0中的部分类这个新特性。
代码隐藏文件声明类的方式:
public partial class a : System.Web.UI.Page
11.什么是viewstate,能否禁用?是否所用控件都可以禁用?
答:Viewstate是用于在两次PostBack之间保存状态的一种机制,禁用ViewState将不能在回发之间保存状态,仅当控件状态无关且使用ViewState将造成性能问题时才禁用ViewState。将EnableViewState属性设置为false可禁用ViewState。
12.当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决?
一种可能是在Page_Load中数据处理时没有对Page的IsPostBack属性进行判断。
13.请解释一个WEB页面中代码执行次序。
答:
(1). 初始化对象,所有声明于aspx页面中的对象在此时被初始化,可以通过重载OnInit来自定义这个初始化过程。
(2). 导入Viewstate数据。在事件处理函数LoadViewState中执行了这个操作
(3). 处理页面实现的IPostBackDataHandler接口中LoadPostData函数,在其中处理了PostBack的数据。
(4). Load事件触发,OnLoad函数中,对象被实现为DOM,客户端可以开始处理DOM。
(5). LoadPostData函数中通过PostBack更新控件后,发生属性变化的控件将触发ReasePostBackChanged事件。这个事件是在所有的控件都被更新以及Load事件处理完毕后进行。(这样保证一个控件在被postback数据更新前,别的控件不会在RaisePostDataChanged事件中被更改。)
(6). 当RaisePostBackChanged事件的处理完毕后,产生PostBack数据的对象开始执行RaisePostBackEvent事件的处理函数。RaisePostBackEvent是在一个回发过程中最后发生的。
(7). 预先呈递对象,可以在这一步中对控件的属性、控件树结构等进行最后的修改。可以通过OnPreRender来重载这一过程。
(8). SaveViewState事件执行,在这一步中所有对控件的更改被保存到<input>这个客户端存储ViewState的地方。这一步以及以后的操作已经不能修改ViewState。SaveViewState事件的处理函数可以被重载以增加自定义的处理。
(9). Render事件将Html输出到浏览器。在这个事件处理中,可以自定义一个HtmlTextWriter并将其输出到客户端,来取代服务器的输出,但这只是对客户端的一种行为,服务器端并不受影响。
(10). 销毁对象,在这一步中所有已经呈递为Html的对象都应被销毁。有些销毁工作应该在Dispose事件(经重载)来完成。
14.请解释什么是上下文对象,在什么情况下要使用上下文对象?
答:上下文对象是指HttpContext类的Current 属性,当我们在一个普通类(一个不是继承自Page类的类)中要访问ASP.NET服务器对象(Response, Request, Session, Server, Appliction等)时就要使用此对象。
15.请解释转发与跳转的区别?
答:转发:HttpServerUtility.Transfer(); 对于当前请求,终止当前页的执行,并使用指向一个新页的指定URL路径来开始执行此新页。可以清除QueryString和Form集合。
跳转:HttpResponse.Redirect(); 将客户端重定向到新的URL并指定该新URL,默认不终止当前页的执行。
参考:http://www.cnblogs.com/jinweida/archive/2008/03/27/1126148.html
16.请解释ASP.NET中不同页面之间数据传递有那些方式?
(1) 使用QueryString:
(2) 使用Application变量,可以传递各类对象,但是有一个缺点就是作为全局变量容易被误操作。
(3) 使用Session。没有Application的缺点,但是大量应用Session可能会消耗服务器资源。
(4) 使用cookie对象,类似于Session针对单用户的特性,但cookie存储于客户端。
(5) 使用Server.Transfer在页面见传递参数。
17.请解释ASP.NET中button、linkbutton、imagebutton及hyperlink这四个控件之间的区别。
答:实现机制:用户单击控件时,HyperLink控件立即转向目标,表单不需回发到服务器端,而LinkButton需将表单发回给服务器,在服务器端处理页面跳转功能。
使用方法:HyperLink只需设置NavigateUrl就可以实现页面跳转。LinkButton控件实现页面跳转是在Click事件中使用Response.Redirect等方法实现的。
Button,LinkButton,ImageButton都属于服务器端的按钮类控件。它们的点击操作都会有一次PostBack。
18.请解释一下.NET多层应用程序中层与层之间以那几种方式进行数据传递。并解释你自己的项目中采用那种方式进行。
答:传统的传递DataSet,另外有传递实体类对象,这种对象包括普通只封装了数据的对象与封装了数据与状态对象这两种情况。还有可以传递用来获取对象的参数。
19.如果出现ASP.NET中的事件不能触发可能由于什么原因造成?
答:有可能由于页面声明中,AutoEventWireup没有被设置为true。
20.如果需要在datagride控件中的某一列中添加下拉列表框并绑定数据怎么解决?
答:(针对ASP.NET2.0以上版本)在GridView中添加一列TemplateFeild列,在其ItemTemplate模板中放入一个DropDownList控件。然后在Gridview的DataBinding方法中将数据绑定到下拉列表。
21.请解释asp.net中的数据绑定与传统数据绑定有什么区别?
答:注意看阿不同志这个系列的文章:http://www.cnblogs.com/hjf1223/archive/2008/05/03/digging_into_binding_expression_1.html
22.请解释.net采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,以图示方式解释。
Java不了解,不进行比较了。
23.请解释接口的显式实现有什么意义?
答:显示实现是通过使用接口的完全限定名来实现接口成员的。如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实现。
Q:您在什么情况下会用到虚方法?它与接口有什么不同?
A:虚方法是父类中为了让派生类可以覆写某一函数,而将此函数标记为虚函数。与接口没有什么关系。虚函数可以有自己的实现。(接口中的函数是不允许有实现的)
Q:Override与重载有什么区别?
A:Override是对父函数中虚函数的覆写,而重载是对一个函数的编写一个同名不同参的新实现,完全是函数之间的关系。
Q:值类型与引用类型有什么区别?
A: 值类型存储于栈上,引用类型存储于托管堆上,声明一个值类型的对象会初始化为一个默认值,而声明一个引用类型默认为null。值类型进行赋值时变量将会被拷贝一份,而引用类型赋值只是复制了一个到引用类型对象的引用。
Q:怎样理解静态变量?
A: 静态变量在类的多个实例之间共享。可以用来完成类的实例数统计等工作。
Q:向服务器发送请求有几种方式?
A:基本上比较常用的方式有GET,POST与HEAD这三种。
Q:DataReader与Dataset有什么区别?
A: Dataset是一套完整的内存中关系数据系统,而DataReader是一种实现单向的只读数据访问的类。
Q:如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?
A: 在不能使用上述方式的情况下,可以使用下列两种方法:
(1) 使用QueryString:
(2) 使用Server.Transfer在页面见传递参数。
Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
A: 较旧一些的分层方式,展现层,业务逻辑层,数据访问层。更新的方式,界面层(Ajax,只使用客户端控件及逻辑),服务Façade,业务逻辑,数据访问。
Q:软件开发过程一般有几个阶段?每个阶段的作用?
A: 需求分析,设计,编码,测试。
Q:微软推出了一系列的Application Block,请举出您所知道的Application Block并说明其作用?
A: Data Access数据访问用,Exception Handling异常处理,Unity Application Block依赖注入容器。
Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?
A: 单例模式,用于工具类。装饰模式,用于包装业务逻辑。抽象工厂模式,用于数据访问层的设计。
Q:您对WebService的体会?
A:传统的Web服务在安全性上存在不足,可以考虑使用WSE来弥补,或者使用WCF这种更优秀的技术。
Q:通过超链接怎样传递中文参数?
A: 可以将中文使用Server.Encode()来进行编码。
Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
A:方法1:
for (int i = 0; i < this.Controls.Count; i++)
{
foreach (System.Web.UI.Control control in this.Controls[i].Controls)
{
if (control is TextBox)
(control as TextBox).Text = string.Empty;
}
}
方法2:
foreach (Control cl in this.Page.FindControl("FormName").Controls)
{
if (cl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
((TextBox)cl).Text = string.Empty;
}
}
参考:http://www.cnitblog.com/ffan/archive/2005/07/30/1193.html
Q:请编程实现一个冒泡排序算法?
A:程序如下:
public static void Main(String[] args)
{
int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5 };
Sort(values);
for (int i = 0; i < values.Length; ++i)
{
Console.WriteLine("Index: " + i + "Value: " + values[i]);
}
}
public static void Sort(int[] values)
{
int temp;
for (int i = 0; i < values.Length; ++i)
{
for (int j = 0; j < values.Length - i - 1; ++j)
{
if (values[j] > values[j + 1])
{
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
}