ASP.NET MVC 3 第一天笔记
Asp.net mvc 应用程序的结构
/Controllers |
保存处理url请求的controller类 |
/Models |
保存表示和操纵数据以及业务对象的类 |
/Views |
负责呈现输出结果(如html)的UI模板文件 |
/Scripts |
保存javascript库文件和脚本 |
/Content |
保存css和图像文件以及其他非动态/非javascript的内容 |
/App_Data |
存储想要读取/写入的数据文件 |
Asp.net mvc和约定
- 约定大于配置
- 约定简化通信
控制器
控制器操作中的参数
//get:/Store/Browse?genre=?Disco
利用实用方法HttpUtility.HtmlEncode
(“Store.Browse,Genre=”+genre)
注:可以阻止用户向视图注入JavaScript代码
/Store/Browse?Genre=<script>window.location=’http://hacker.example.com’</script>
视图
检查由控制器提交的ViewDataDictionary(通过ViewData属性访问),另外一部分是将其内容转换成HTML格式
Asp.net mvc 3中 ViewBag出现,动态的
ViewData[“Message”] 相当于 ViewBag.Message
大多情况下,不存在真正的技术优势
差异
1.访问的关键字是一个有效的C#标识符使,viewBag才起作用
如果在ViewData[“Key with Spaces”]中存放一个值,那么将不能使用ViewBag访问
- 动态的值是不可以作为参数传给扩展方法的。因为编译器为了选择正确的扩展方法,必须知道每一个参数的真正类型
如:@Html.TextBox(“name”,ViewBag.Name)是错误的,
使用ViewData[“Name”]或(string)ViewBag.Name
指定视图
Public ActionResult Index(){
ViewBag.Message =”Hello, Vinkong”;
Return View(“NotIndex”)
}
上面仍然在/Views/Home目录中查找
需要指定完全不同的目录结构中的视图,可以使用~符号来提供完整的路径
Return view(“~/View/Example/Index.cshtml”);
强类型视图
Public ActionResult List(){
Var albums = new List<Album>();
for(int i=0;i<10;i++){
Albums.add(new Album(Title =”Product”+i));
}
ViewBag.Albums = albums;
Return View();
}
视图:
第一种方式
@foreach(Album a in (ViewBag.Alblums as IEnumerable<Album>)){
<li>@a.Title</li>
}
第二种方式简洁,但是不能使用智能提示
@foreach(dynamic p in ViewBag.Albums){
<li>@p.Title</li>
}
第三中方式,需要输入模型的完全限定名
@model IEnumerable<MvcApplication1.models.Album>
<ul>
@foreach(Album p in Model){
<li>@p.Title</li>
}
如果不想输入完全限定名称,可以使用@using关键字声明
@using MvcApplication1.Models
@model IEnumerable<Album>
Foreach(Album p in Model){
<li>@p.Title</li>
}
注:经常使用的名称空间,可以在View目录下的web.config文件声明
<add namespace=”MvcApplication1.Models”>