当前位置:首页 » 网站技术 » ASP.NET

WebForm和MVC页面处理的对比

...

在MVC中,服务器端的行为是由进来的URL控制的,譬如,在Scott Guthrie的博客中示范的/Products/Categories URL,会调用ProductsController的Categories方法,该方法从数据库里获取数据,然后它通过RenderView调用某个视图(示范中是“Categories”视图),把数据传给视图,该视图会根据传入的数据生成HTML,返回给用户。

如果是个添加、更改数据的操作,譬如添加一个分类,那么你大概会有类似这样的表单(譬如来自“CategoryInfo”视图): <form method="post" action="/Products/AddCategory">
<input type="text" name="Category.Name">
...
<input type="submit" name="btnAdd" value="submit">
</form>
在用户提交表单时,系统会调用ProductsController的AddCategory方法,根据AddCategory的签名,系统会自动填充生成Category对象所需的数据或者你需要从Request对象中手工获取数据,更新数据库完毕之后,你可以通过转向等方式返回到/Products/Categories。

在这2个例子(/Products/Categories和/Products/AddCategory)中,我们有一个控制器ProductsController,和2个视图(“Categories”和“CategoryInfo”)。视图只用作显示HTML之用,所有的应用逻辑都在ProductsController中。

在目前的WebForm做法中,你大概会有2个网页Categories.aspx和AddCategory.aspx。常见的做法是,在Categories.aspx的Page_Load或其他事件中,你大概会调用某个服务对象或Presenter对象获取数据,然后根据数据生成HTML。对于AddCategory.aspx,在用户提交表单后,postback返回当前页面,系统会调用按钮点击的处理函数,然后你大概会在该函数里收集数据,调用某个服务对象或Presenter对象更新数据库,然后转向到Categories.aspx。在这个做法中,系统是根据从表单返回的Request.Form数据(ViewState,以及在Request.Form存在类似btnAdd=submit这样的数据)来决定调用那个方法的(因为一个页面上可以有保存按钮,删除按钮等等),控制是在页面层次,跟Products有关的应用逻辑散居于多个页面的后台代码中(你也许可以使用MVP这样的模式,把控制的逻辑集中到Presenter里去,但这改变不了最初的控制来自页面这个事实,而且一般情形下,一个Presenter大多只跟一个页面有关联)。

有个同事问我,那么WebForm中的AutoPostback=true的DropDownList该如何在MVC中实现呢?在WebForm中,如果一个DropDownList设置了AutoPostback=true,用户改变选择时,表单会自动postback,ASP.NET会对该DropDownList的ViewState里保存的数据和该DropDownList返回的值做比较,然后触发DropDownList的SelectedIndexChanged事件。。。在MVC中,你大概可以这么做 <select name="category" onchange="this.form.action='/Products/ChangeCategory';this.form.submit();">
...
</select>
在表单自动提交后,MVC会调用ProductsController的ChangeCategory方法,该方法会根据情况做些操作,调用视图等等。如果这个选项改动需要更新当前页面的某个局部,那么onchange也许可以调用某个AJAX方法,只传回必要的数据到服务器,而ProductsController的ChangeCategory方法可以返回要做的HTML变化等。

继续阅读
ASP.NET进度条
没有数据时显示GridView表格
ASP.NET中的换行问题解决方案
ASP.NET跳转页面方法比较
ASP.NET内置功能抵御Web攻击
ASP.NET写文件实例
ASP.NET页面间值传递方法实例
使用ASP.NET备份和还原SQL Server及Access数据库
ASP.NET日期与时间处理
发表评论

昵称:
最新评论
暂时没有评论!