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) %>

注意这两个都不能丢

 

 

posted @ 2012-10-19 17:28  伯箫  阅读(218)  评论(0编辑  收藏  举报