zoukankan      html  css  js  c++  java
  • 初识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的第一步,明天记录第二步。

  • 相关阅读:
    LightOj 1016
    uva 127 "Accordian" Patience 简单模拟
    hdu 1180 诡异的楼梯 BFS + 优先队列
    UVALive 3907 Puzzle AC自动机+DP
    HDU 4001 To Miss Our Children Time DP
    HDU 4000 Fruit Ninja 树状数组
    hdu_1021_Fibonacci Again_201310232237
    hdu_1005_Number Sequence_201310222120
    hdu_1029-Ignatius and the Princess IV_201310180916
    hdu_1020_Encoding_201310172120
  • 原文地址:https://www.cnblogs.com/hawkon/p/1558386.html
Copyright © 2011-2022 走看看