初识MVC

 

看了一篇赵劼老师的视频,对MVC有点认识但还是不清晰,今天MVC终于下载安装完成了,不管先试试。

打开2008后看到添加项目模板里添加了一项:ASP.NET MVC WebApplication

选择后还会提示是否创建TEST项目。

进到解决方案管理器后头有点大: 

东西真多,先看看效果吧,我学习一向遵循先感性后理性的规律。

跑起来后页面中只有两个有意义的链接:

http://localhost:2044/Account/LogOn  登录页面

http://localhost:2044/Home/About  关于页面,没啥实际意义

登录页面还有点货,还有一个链接:http://localhost:2044/Account/Register

 


 

public class HomeController : Controller {
    
public ActionResult Index() {
        ViewData[
"Message"= "Welcome to ASP.NET MVC!"

        
return View();
    } 

    
public ActionResult About() {//和View目录中的Home/About.aspx文件相对应
        return View();
    }
}

分析这段代码之后知道了
1、Controller起名必须是Controller结束,前面代表的是Controller,也就是地址栏里面的虚拟目录部分,然后是Action部分,对应于Controller的一组重载的方法还有View中的一个aspx页面。
2、可以通过ViewData["Message"]=""这种方式往页面中传数据,页面中取到的就是一个对象。
3、ViewData是一个Dictionary,存的是object。所以其它的数据也可以存。
4、LogOn的Controller中包含下面两个方法:


 

 public ActionResult LogOn() {

            
return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Design""CA1054:UriParametersShouldNotBeStrings",
            Justification 
= "Needs to take same parameter type as Controller.Redirect()")]
        
public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) {

            
if (!ValidateLogOn(userName, password)) {
                
return View();
            }

            FormsAuth.SignIn(userName, rememberMe);
            
if (!String.IsNullOrEmpty(returnUrl)) {
                
return Redirect(returnUrl);
            }
            
else {
                
return RedirectToAction("Index""Home");
            }
        }

一个无参的重载,一个四参数的重载。
下面注意看aspx页面中的关键内容:


 

<% using (Html.BeginForm()) { %>
        
<div>
            
<fieldset>
                
<legend>Account Information</legend>
                
<p>
                    
<label for="username">Username:</label>
                    
<%= Html.TextBox("username"%>  //这里一个username和上面参数名字相同
                    <%= Html.ValidationMessage("username"%>
                
</p>
                
<p>
                    
<label for="password">Password:</label>
                    
<%= Html.Password("password"%>   //这里一个password和上面参数也相同
                    <%= Html.ValidationMessage("password"%>
                
</p>
                
<p>
                    
<%= Html.CheckBox("rememberMe"%> <label class="inline" for="rememberMe">Remember me?</label>   //这里还有一个rememberMe和参数又相同了,而且这是一个CheckBox
                </p>
                
<p>
                    
<input type="submit" value="Log On" />
                
</p>
            
</fieldset>
        
</div>
    
<% } %>

这些Aspx代码生成的HTML代码:



<form action="/Account/LogOn" method="post">
        
<div>
            
<fieldset>
                
<legend>Account Information</legend>
                
<p>
                    
<label for="username">Username:</label>
                    
<input id="username" name="username" type="text" value="" /> //表单元素name属性和参数名字相同
                    
                
</p>
                
<p>
                    
<label for="password">Password:</label>
                    
<input id="password" name="password" type="password" />//表单元素name属性和参数名字相同
                    
                
</p>
                
<p>
                    
<input id="rememberMe" name="rememberMe" type="checkbox" value="true" />//表单元素name属性和参数名字相同
<input name="rememberMe" type="hidden" value="false" /> //表单元素name属性和参数名字相同这里为什么会还有一个rememberMe呢?和应该和checkbox的提交有关,如果checkBox选中的话,数据会被提交,如果没选中,那么rememberMe不会被提交,这样就没有数据提交给Controller的LogOn方法(四个参数的重载)了,

<label class="inline" for="rememberMe">Remember me?</label>
                
</p>
                
<p>
                    
<input type="submit" value="Log On" />
                
</p>
            
</fieldset>
        
</div>
    
</form>

经过对上面代码的分析,猜测了一下MVC的大致流程:
1、ASP.NET接收到请求之后,对请求的址进行Route,交给相对就应的Controller。
2、其后根据地址中Action部分的内容调用了Controller中相应的方法。
      这里注意,上面的html代码还是提交给了LogOn这个Action,但是因为是表单提交回的数据,在Controller中执行的方法就不一样了,提交回的数据将会执行的是四个参数的重载,参数的值分别是表单中提交回的数据,但是还有一个问题,第四个参数从哪儿来?
结合前面代码中的这个片断:


            FormsAuth.SignIn(userName, rememberMe);
            
if (!String.IsNullOrEmpty(returnUrl)) {
                
return Redirect(returnUrl);
            }
            
else {
                
return RedirectToAction("Index""Home");
            }

可以猜测,因为用到了表单验证:FormsAuth.SignIn(userName, rememberMe);
那么表单验证这方法会自动生成一个url参数returnUrl做为登录之后要跳转的目录,那么这个returnUrl一定是从参数中得来。
由此和前面所有的东西都对上号了。
等这些方法处理完成之后一般是跳转到另一个Action再处理。



==============================================================================
以上是理解认识MVC的第一步,明天记录第二步。

posted @ 2009-09-01 23:04  Hawkon  阅读(425)  评论(0编辑  收藏  举报