MVC5.0知识点梳理
我们在使用MVC的时候或许总是在使用着自己一直熟悉的知识点去实现已有的功能,多梳理一些知识点让每种功能的实现方式可以多样化.
我们在开发小型系统时总是使用微软MVC的脚手架功能,比如路由可能就是使用了默认的路由,在稍微复杂或者大型的系统中其实我们可以自定义路由的.
路由约束
routes.MapRoute(
name:"Language",
url:"{language}/{controller}/{action}/{id}",
defauts:new {controller="Home",action="Index",id=UrlParameter.Optional},
contrains:new {language=@"(en)|(de)"}
上边的约束通过使用(en)|(de),定义了language参数只能是en或de.举例:http://<server>/en/Home/About或者http://<server>/de/home/About都是合法的.
动作方法
(1)动作方法可以声明为带有参数
Public string Greeting(string name)
{
return HttpUtility.HtmlEncode("Hello,"+name);
}
有了此声明,可以使用http://<server>/Home/Greeting?name=Danile的方式(URL字符串)来调用此方法。
(2)可以声明路由配置
默认的路由中有Id的参数,所以以上的方法可以声明为如下:
Public string Greeting(string id)
{
return HttpUtility.HtmlEncode("Hello,"+id);
}
调用方式如下:http://<ServerName>/Home/Greeting/1
(3)动作方法可以声明为多个参数
public int Add(int x,int y)
{
return x+y;
}
可以使用如下url来调用此动作,以填充x和y参数的值:http://<server>/Home/Add?x=4&y=5
当然还可以定义一个路由,以在不同的链接中传递值,如下:
routes.MapRoute(
name:"MultipleParameters",
url:"{controller}/{action}/{x}/{y}",
defauts:new {controller="Home",action="Index"},可以使用http://<server>/Home/Add/7/2来调用;
视图
向视图传递数据-控制器和视图运行在同一个进程中。视图直接在控制器内创建,这便于从控制器向视图传递数据;
Razor语法(/使用@做为迁移字符)可以自动检测到c#代码的结束为止,但有些情况中,这是无法自动看出来的。此时,可以使用圆括号来标记变量,例如:
<div>@(name),Stephanie</div>,有时候不识别可以尝试另一种方式:@:来显示定义文本开始的位置
布局
所有的视图页面都默认使用布局页,如果当前页面不使用布局页,需要将Layout属性设置为null来明确指定:
@{
Layout=null;
}
_ViewStart.cshtml页面包含全部视图的默认配置.默认定义的唯一设置是将Layout属性设为共享布局页_Layout.cshtml.
使用分区
使用@section可以指定区块代码,然后布局页可以引用被加载视图中的不同模块.
从客户端提交数据
@{
@:ViewBag.Title = "Create Menu";
}
<h2>Create Menu</h2>
<form action="/SubmitData/CreateMenu" method="post">
<fieldset>
<legend>Menu</legend>
<div>Id:</div>
<input name="id" />
<div>Text:</div>
<input name="text" />
<div>Price:</div>
<input name="price" />
<div>Category:</div>
<input name="category" />
<div></div>
<button type="submit">Submit</button>
</fieldset>
</form>
默认情况下,http请求方法是GET,应用HttpPost特性后,请求方法是POST。为读取httpPost数据,可以使用Request对象中的信息.
但是定义带参数的CreateMenu方法要简单多了。参数的名称与表单字段的名称匹配
[HttpPost]
public ActionResult CreateMenu(int id,string text,double price,string category)//跟form中的表单字段同名(name同名)
{
......
}
模型绑定器
除了在动作方法中使用多个参数,还可以使用类型,类型的属性与输入的字段名称匹配:
[HttpPost]
public ActionResult CreateMenu(Menu m)
{
ViewBag.Info = string.Format(
"menu created: {0}, Price: {1}, category: {2}", m.Text, m.Price,
m.Category);
return View("Index");
}
模型绑定器负责传输HTTP POST请求中的数据。模型绑定器实现IModelBinder接口。默认情况下。使用DefaultModelBinder类将输入字段绑定到模型
注释和验证
public class Menu
{
public int Id { get; set; }
[Required, StringLength(25)]
public string Text { get; set; }
[DisplayName("Price"), DisplayFormat(DataFormatString="{0:C}")]
public double Price { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
[StringLength(10)]
public string Category { get; set; }
}
用于验证的特性包括:用于比较不同属性的CompareAttribute,用于验证信用卡号的CreditCardAttribute,用来验证电子邮件地址的EmailAddressAttribute,用来比较输入与枚举值的
EnumDataTypeAttribute,以及用来验证电话号码的PhoneAttribute,为了使用验证特性,可以在动作方法内使用ModelState.IsValid来验证的状态.
当我们定义了某个模型不能修改时,我们可以定义另一个拥有同样属性的模型,并且把这个模型使用特性添加到需要约束的类上.
例如:定义MenuMetadata类:
public class MenuMetadata
{
public int Id { get; set; }
[Required, StringLength(25), CreditCard]
public string Text { get; set; }
[DisplayName("Price"), DisplayFormat(DataFormatString="{0:C}")]
public double Price { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
[StringLength(10)]
public string Category { get; set; }
}
[MetadataType(typeof(MenuMetadata))]
public partial class Menu
{
public int Id { get; set; }
public string Text { get; set; }
public double Price { get; set; }
public DateTime Date { get; set; }
public string Category { get; set; }
}
再大的系统都是由零碎的知识点组成的,好的基础就是好的地基.
MVC5.0知识点梳理的更多相关文章
- Memcache知识点梳理
Memcache知识点梳理 Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...
- [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(三)导入、导出
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(二)数据库的连接
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- 《精通MVC5.0》路由笔记
MVC使用路由系统处理请求的URL.路由系统主要功能 检查请求的URL,并理解该URL对应的控制器和方法 生成URL地址 在MVC程序中有两种方式创建路由:convention-based routi ...
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...
- IoC实践--用Autofac实现MVC5.0的IoC控制反转方法
Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...
- MvcMovieStore mvc5.0,EF6.01
MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4.创建数据上下文和数据实体模型 说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登 ...
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4、创建数据上下文和数据实体模型
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dodu ...
随机推荐
- 红帽7中firewall常用指令
1.端口管理 (1)列出DMZ区域开放的端口 ~]#firewall-cmd --zone=dmz --list-ports (2)8080端口加入dmz区 ~]#firewall-cmd --zon ...
- 三种方法实现java调用Restful接口
1,基本介绍 Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法比较多, 本次介绍三种: 1.HttpURLConnection实现 2.HttpClient实现 3.Spring ...
- CVE-2013-2551
目录 小白的CVE-2013-2551 分析 & 利用 0xFF 前言 0x00 环境和工具 0x01 分析POC POC 调试 0x02 利用 构造R3任意内存读写 劫持eip 利用利用 0 ...
- js 小数计算时出现多余的数据
根据资料显示:是由于十进制换算成二进制,处理后,再由二进制换算成十进制时,造成的误差. 得出:所以(0.1+0.2)!=0.3 而是=0.30000000000000004的结果 解决方法: 参考:h ...
- DevExpress03、GridControl
设计数据源并绑定字段: 数据源可以是实现下列接口之一的任何类型: IList 接口,包括一维数组.List<T>等! IListSource 接口,例如,DataTable 和 DataS ...
- 【Android自动化】在使用uiautomator框架自动化时,往往有时再运行脚本时发现xxx实例属性不被允许
例如: # -*- coding:utf-8 -*- from uiautomator import device as d d(classname="android.widget.List ...
- Flex 布局知识点梳理
传统的布局方案,在针对特殊布局时会很不方便,比如垂直居中,把一个容器等分为N列等等.自从 Flex 出现以后,这些都迎刃而解了,本文对Flex相关内容做一个简单梳理. 什么是 Flex Flex 是 ...
- [BeiJing2006]狼抓兔子
题面 一眼看就是最小割板子题,建图也很直观,注意每一条边建双向边其实不用建4条边,只要反向边的容量和正边相同就行.然后直接跑最大流板子就行.不过此题拿vector存图会MLE……而拿链前存图就能卡过去 ...
- Stay true to yourself
https://zhuanlan.zhihu.com/p/22928614 艾伦·德詹尼斯,1958年1月26日出生于美国路易斯安纳州梅泰里,美国主持人.演员.凭借出众的诙谐幽默的口才和喜剧天赋,活跃 ...
- C++ 虚函数的使用
虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: #include <iostream> using na ...