代码改变世界

Pro ASP.NET MVC 2 Framework(2E) —— Chapter2 Your first ASP.NET MVC Application

2011-08-30 00:29  传奇PANDA  阅读(246)  评论(0编辑  收藏  举报

Technorati Tags: ASP.NET MVC,.NET,Form
创建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相同

Pointing up:对于HttpPost方法,我们知道,当表单提交后,会调用这个方法,但是注意其参数类型为"GuestResponse”,但是这个类型对于HTTP必然是未知的,那么HTTP如何传递这个类型的对象给此方法呢?

答案是:Model Binding

 

知识补充:

*当用户点击一个link的时候,通常情况下,是用Get方式提交的

*英语小知识:RSVP是“敬请回复”的意思

*在aspnet.codeplex.com可以下载到ASP.NET MVC的源码