从上图可以看出,整个请求过程看上去很奇怪: 用户发起一个HTTP请求,比如HTTP POST / GET IIS服务器将请求映射到视图 视图调用页面的生命周期,通过事件驱动,调用合适的交互方法 最后将交互的结果展现给终端用户 因为微软一开始就选择了基于视图的设计方案,所以架构本身很难向基于用户交互的设计思想靠拢。换句话说,当用户发出“购买”请求时,先是访问了视图页面“Shopping.aspx”,后台逻辑代码在“Shopping.aspx.cs”中,页面生命周期中会将页面的计算结果返回给用户。
这在Webform中实现起来是非常麻烦的。 问题5、将behind code当做普通的类来进行单元测试 behind code后台代码在Webform中是一个非常庞大的类,并且不能简单地实例化。要知道Webform是继承于Page类的,Page类不能直接实例化,因为它有太多的依赖项了。 public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {
}
public void Button1_Click(object sender, EventArgs e) { Session["SomeSession"] = "Is this set"; } }
你为什么想要实例化Page类呢?其中一个原因就是可以方便单元测试。比如我要测试一个按钮点击事件,用来检查Session是否设置成功。在Webform中的代码看起来不是那么舒服: [TestMethod] public void TestMethod1() { WebApplication22.WebForm1 obj = new WebApplication22.WebForm1();
obj.Button1_Click(this, new EventArgs()); }
并且运行时还会抛出一个异常:
在MVC中,这个类变成了一个普通类,我们可以在测试工程中将它实例化,并对类里面的属性方法、Session、viewbag 、 tempdata等进行单元测试。 public class HomeController : Controller // ß this class is simple { public ActionResult Index() { Session["SomeSession"] = "Is this set"; return View("SomeView"); } }