Pro ASP.NET MVC 2 Framework(2E) —— Chapter2 Your first ASP.NET MVC Application
2011-08-30 00:29 传奇PANDA 阅读(246) 评论(0) 编辑 收藏 举报创建ASP.NET MVC2 Application:
1.”ASP.NET MVC2 Web Application”,这里面包含了一个微软的小SAMPLE,这个SOLUTION也是可以BUILD的(!:如果同时创建了单元测试项目,则需要在单元测试中引用WEB项目,否则无法编译通过)
2.”ASP.NET MVC2 Empty Web Application”,只包含了运行MVC2所必要的文件(!:这种项目创建后,如果RUN会出错,因为没有包含任何的controller,所以无法处理request)
Controller,Action,View
controller负责处理到来的request,所谓controller实际只是继承自System.Web.Mvc.Controller的类,controller中的方法就是Action
而view则通常通过name和Action联系在一起
controller的作用是组织数据,view的作用是展示数据
关于URL
传统的Webform模式中,URL并没有和服务器端磁盘上的文件有特定的关联。
在ASP.NET MVC中,URL通过Routing configuration和特定的controller中的特定的action相关联。每个Action自动地会有自己的URL
Strong Typed View
*普通View: !上方的Inherits,为:System.Web.Mvc.ViewPage<dynamic>
*Strong Typed: System.Web.Mvc.ViewPage<PartyInvites.Models.GuestResponse>:其中,PartyInvites.Models.GuestResponse为某个Model
!:只有在Strong Typed的View中,才可以使用,诸如:<%: Html.TextBoxFor(m=>m.Name) %>,用Lambda表达式来获取property,因为View已经知道了m的类型
!:<%: Html.TextBoxFor(m=>m.Name) %>的非强类型写法:<%:Html.TextBox(“Phone”)%>
优点: 与非强类型的写法比较,强类型的写法能够得到Visual Studio的智能感知,最重要地,如果重命名了一个model的property,则所有的Strong Typed View也会随之更新
Html.BeginForm()
模拟了html中的<form></form>
* 一般地,会有type=”submit”的input元素,用于提交表单,对于BeginForm()而言,默认地,会将表单post至它所在的那URL,例如当前表单位于的URL为"Home/RsvpForm”,则将解析成:
<form action=”Home/RsvpForm” method=”post”>
……
</form>
* 但是BeginForm()也可以接受参数,用来指明Submit的时候,post去哪一个Action
*两种使用方式:
1.<%using(Html.BeginForm()) {%>
contents here
<%}%>
2. <%Html.BeginForm()%>
contents here
<%Html.EndForm()%>
Webform和MVC中的Form比较
传统的Webform
要求整个页面包含在一个server-side的form中,(ie. <form runat=”server”></form>), 这个form是ViewState和Postback的容器。当提交表单时,基于ViewState和Postback机制,页面中控件(例如Textbox)的数据
得以保存
ASP.NET MVC
ASP.NET MVC中没有server-side的form,用的是纯粹的HTML<form>(ie..<form></form>, <%Html.BeginForm()%>..<%Html.EndForm()%>。用户可以在同一个view page中包含多个<form>(通常用BeginForm(),EndForm()输出),并且不会产生多余的输出(例如ViewState)。
正因为ASP.NET MVC中没有postback和viewstate的存在,所以当多次提交一个表单页面时,其中的数据是不会自动保存的。甚至对于form中的每一个元素,下次请求得到的和现在根本是不同的,因为Http属于无状态协议,
故对于每一个请求,表单中的元素都是新生成的
Form Submission
点击link进入一个Form的view时,一般是Get请求,而Form本身提交时,一般使用Post请求,所以在ASP.NET MVC中,处理表单提交时,一般可以写两个方法分别处理GET和POST
*GET方法:一般用来展示初始的空表单,当用户通过点击link进入这个Form的view时调用
*POST:用来接收和处理提交的上来的表单数据。
使用C#可以在对应的Controller中,写如下两个方法
[HttpGet]
public ViewResult RsvpForm()
{
return View();
}
[HttpPost]
public ViewResult RsvpForm(GuestResponse guestResponse)
{
//To do: Email guest response to the organizer
return View("Thanks", guestResponse);
}
从调用者的角度来说,这对方法在逻辑上是同一个方法,因为它们名字相同,并且调用它们的URL相同
:对于HttpPost方法,我们知道,当表单提交后,会调用这个方法,但是注意其参数类型为"GuestResponse”,但是这个类型对于HTTP必然是未知的,那么HTTP如何传递这个类型的对象给此方法呢?
答案是:Model Binding
知识补充:
*当用户点击一个link的时候,通常情况下,是用Get方式提交的
*英语小知识:RSVP是“敬请回复”的意思
*在aspnet.codeplex.com可以下载到ASP.NET MVC的源码