MVC学习笔记
MVC
1、开发流程与页面请求过程
新建Controller
创建Action
根据Action创建View
在Action获取数据并生产ActionResult传递给View。
View是显示数据的模板
url请求→Controller.Action处理→View响应
在controller中,像这样:return View(),没有指定返回到哪一个页面的时候,MVC会先到View文件夹下,与这一个ActionResult方法同名的文件中找前面显示页面。如果没有找到,就会去View文件夹下的Shared文件夹下找,还没找到就报错。
2、约定大于配置
Controller放到controllers文件夹中,并且命名方式以XxController结尾
每个Controller都对应View中的一个文件夹,文件夹的名称跟Controller名相同
Controller中的方法名都对应一个View(非必须,但是建议这么做)而且View的名字跟Action的名字相同
3、数据的取用
刚学MVC的时候,要在视图中使用Controllers中的数据时,我们可能会用这样写:((MvcFirst.Models.UserModels)ViewData[“ModelName”]).name
但是,如果每次要取一条数据的时候,都这样写一长串,肯定感觉不爽,有一种简便的方法。我们可以在头文件中Inherits="System.Web.Mvc.ViewPage<dynamic >"
把dynamic改成我们想要的模型。如:
Inherits="System.Web.Mvc.ViewPage<MvcFirst.Models.UserModels>"
这样,就告诉了我们的Model,它是一个UserModels类型的。我们用它的时候就不用每次都强转了。取数据的时候这样写便可:<%:Model.Name %>
但是,仅仅这样还是不行的,因为这里只是告诉了Model,它是什么类型的,还没有给它赋值。赋值工作就要在相就的controller中做了。这里,我们应该在UserController中写这么一句:
ViewData.Model = User,
那么,为什么这样就可以了呢?
其实,Model是ViewPage这个类的一人成员
public class ViewPage<TModel> : ViewPage
{
public TModel Model { get; }
}
TModel就是范型的一个模版,所以,dynamic那个位置的值就是传给模版的值。
说到这里,另外一个问题就出来了。如果一个视图中涉及到了多个类,应该怎么办呢?
MVC中有一个叫做<html.RendAction>的,可以指定,只在一块区域中显示一个类中的成员。
4、数据的显示
从Controller中取出数据到view中去显示时,一般我们会用一个linq语句把所有的数据都取出来。如下所示:
var allComputer = from cp in cmc.Computer
select cp;
然后交给ViewData.Model。让它在View中去显示。
其实,我们也可以用另外一种方式。
var allComputer = cmc.Computer.AsEnumerable<Computer>();
因为,我们进行linq选择的时候,本质上出就是做了一个转换,让它能够用foreach来迭代。
5.MVC中在前台显示数据,为什么改成HTMLHelper了,而不延用APS.NET中的HTML控件?
首先,我们要知道,MVC中还是可以使用HTML控件的。当然,也可以自己手写HTML。但是,使用HTMLHelper有一个好处。下面举一个例子。
在TeacherController中,写下面的代码:
public ActionResult Index()
{
ViewData["txt1"] = "hello";
ViewData["txt2"] = "world";
return View();
}
然后,在view中写下面两种标签:
<%:Html.TextBox("txt1") %>
<input type="text" id="txt2" />
显示的时候,第一个text中会有hello,而第二个中没有。
这样,我们就很明显可以看出来。用htmlhelper,在显示数据的时候,系统会自动完成一个为同名的标签加载数据的过程。
6.HTMLHelper中提供的两种写HTML标签的方式。
第一种,就是上面所看到的,html.textbox()。
第二种,是html.TextBoxFor();里面放lambda表达式。
如:html.TextBoxFor(T=>T.Id)。这里的T表示的时Model中存入的数据类型。
7.几种常用控件的使用方式
(1)、DropDownList
var items = new List<SelectListItem>()
{
(new SelectListItem() {Text = "001", Value = "1", Selected = false}),
(new SelectListItem() {Text = "002", Value = "2", Selected = false})
};
将items值给ViewData:
ViewData["items"] = items;
在aspx中这样使用:
<%: Html.DropDownList("items") %>
生成的代码中,items将作为<select>标签的name和id值。
(2)、CheckBox & RadioButton
<%: Html.CheckBox(“bookType”) %> 在Controller获取提交的值为(true,false)未操作 true选择 false不选择三种
RadioButton第一个参数为控件名字(名字相同说明为同一个Group),返回值为第二个参数(红色部分)
<%: Html.RadioButton("favColor", "Blue", true) %> Blue <br />
<%: Html.RadioButton("favColor", "Purple", false)%> Purple <br />
<%: Html.RadioButton("favColor", "Red", false)%> Red <br />
<%: Html.RadioButton("favColor2", "Orange", false)%> Orange <br />
<%: Html.RadioButton("favColor2", "Yellow", false)%> Yellow <br />
<%: Html.RadioButton("favColor2", "Brown", false)%> Brown <br />
<%: Html.RadioButton("favColor2", "Green", false)%> Green
(3)、超链接
第一种:跳转到本个Controller上的一个页面
<%:Html.ActionLink("跳转到测试页面","TestPage") %><br />
第二种:跳转到另一个Controller上的一个页面
<%:Html.ActionLink("跳转","TestPage","Test") %>
(4)、部分视图与内联视图
<%Html.RenderAction("InlinePage"); %> //注意这里的书写方式,不要两点,后面加分号
<%Html.RenderPartial("PatialPage"); %>
(5)、表单
<%using(Html.BeginForm("Index","Home")){ %>
姓名:<input type="text" id="txt1" name="txt1"/><br />
<input type="submit" value="提交"/>
<%} %>
8. HtmlHelper扩展方法
扩展方法:
1.方法所在的类必须是静态的
2.方法也必须是静态的
3.方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。
4.在第一个参数前面还需要有一个this关键字。
在MVC中扩展HtmlHelper后,要在使用扩展方法的页面上引用扩展方法所在的名称空间
例如: <%@ Import Namespace="MVCDemo.Models" %>
9.MVC验证
第一、 在model中的需要验证的字段前加上标记
如:[StringLength(50,ErrorMessage="ID太长了!")]
public string Id{get;set;}
[Required(ErrorMessage = "名字不能为空")]
public string Name { get; set; }
[RegularExpression(@"^[0-9]*$",ErrorMessage="电话号码有误!")]
public string Tel { get; set; }
第二、在视图中加上两个ajax验证必需的js文件。
MicrosoftAjax.js和MicrosoftMvcValidation.js。
这里要注意的是:在MVC路径的问题,他与WebForm不同,不能直接用使用相对路径或者绝对路径,而要经过Url.Content()进行转换,如:<script src="<%:Url.Content("http://www.cnblogs.com/Scripts/MicrosoftAjax.js")%>" type="text/javascript"></script>
第三、在表单元素前加上这个代码:<%Html.EnableClientValidation(); %>,意思是启用AJAX的前台验证
第四、表单元素中的控件要使用…for的那种,里面写lambda表达式,如
<%:Html.TextBoxFor(model => model.Tel)%>
<%:Html.ValidationMessageFor(m=>m.Tel) %>
注意这两个都不能丢