我们在使用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知识点梳理的更多相关文章

  1. Memcache知识点梳理

    Memcache知识点梳理 Memcached概念:    Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...

  2. [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  3. [独孤九剑]Oracle知识点梳理(三)导入、导出

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  4. [独孤九剑]Oracle知识点梳理(二)数据库的连接

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  5. 《精通MVC5.0》路由笔记

    MVC使用路由系统处理请求的URL.路由系统主要功能 检查请求的URL,并理解该URL对应的控制器和方法 生成URL地址 在MVC程序中有两种方式创建路由:convention-based routi ...

  6. Javascript重要知识点梳理

    Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...

  7. IoC实践--用Autofac实现MVC5.0的IoC控制反转方法

    Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...

  8. MvcMovieStore mvc5.0,EF6.01

    MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4.创建数据上下文和数据实体模型 说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登 ...

  9. 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4、创建数据上下文和数据实体模型

    说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dodu ...

随机推荐

  1. 获取本机正在使用的ipv4地址(访问互联网的IP)

    [转]原文地址:http://www.cnblogs.com/lijianda/p/6604651.html 1.一个电脑有多个网卡,有线的.无线的.还有vmare虚拟的两个网卡.2.就算只有一个网卡 ...

  2. .Net 初步学习笔记之三---变量

    一.存储变量的语法: 变量类型  变量名: 变量名=值: “=”号:把等号右边的值赋值给等号左边的变量 二.常用的变量 1.整数类型 int  //只存整数,不能存小数 2.小数类型 double   ...

  3. Linux内核参数基础优化

    web 服务负载均衡器常规网站服务器优化的基本配置: net.ipv4.tcp_fin_timeout =2 net.ipv4.tcp_tw_reuse =1 net.ipv4.tcp_tw_recy ...

  4. python基础学习2

    一.算数运算符 +加法,-减法,*乘法,/除法,//地板除,%求余,**幂运算. 二.逻辑运算符 非not.且and.或or.优先级依次为not,and,or. 三.print()end结尾 prin ...

  5. zabbix之运维疑难总结

    2.trousers包 zabbix默认情况下要求trousers包的版本是0.3.12版本以上.如果低于这个版本,有可能zabbix-server服务启动不成功.在mysql7.1版本以上可能会使用 ...

  6. 高斯求积公式 matlab

    1. 分别用三点和四点Gauss-Chebyshev公式计算积分 并与准确积分值2arctan4比较误差.若用同样的三点和四点Gauss-Legendre公式计算,也给出误差比较结果. 2*atan( ...

  7. 第 15 章 位操作(binbit)

    /*------------------------------------ binbit.c -- 使用位操作显示二进制 ------------------------------------*/ ...

  8. time模块案例演示

    案例01: 2008年8月8日20:08:08 往后88,888,888秒是哪天?星期几? 日期->时间戳(浮点数)->可以做数学运算 演示: import time # 构造日期的元组, ...

  9. DeepWalk学习

    DeepWalk Background 使用机器学习的算法解决问题需要有大量的信息,但是现实世界中的网络中的信息往往比较少,这就导致传统机器学习算法不能在网络中广泛使用. (Ps: 传统机器学习分类问 ...

  10. JMETER TPS

    上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...