初识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 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中包含下面两个方法:
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页面中的关键内容:
<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代码:
<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中执行的方法就不一样了,提交回的数据将会执行的是四个参数的重载,参数的值分别是表单中提交回的数据,但是还有一个问题,第四个参数从哪儿来?
结合前面代码中的这个片断:
if (!String.IsNullOrEmpty(returnUrl)) {
return Redirect(returnUrl);
}
else {
return RedirectToAction("Index", "Home");
}
可以猜测,因为用到了表单验证:FormsAuth.SignIn(userName, rememberMe);
那么表单验证这方法会自动生成一个url参数returnUrl做为登录之后要跳转的目录,那么这个returnUrl一定是从参数中得来。
由此和前面所有的东西都对上号了。
等这些方法处理完成之后一般是跳转到另一个Action再处理。
==============================================================================
以上是理解认识MVC的第一步,明天记录第二步。