MVC5.0知识点梳理_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MVC5.0知识点梳理

MVC5.0知识点梳理

 2017/7/30 17:38:42  tuohaibei  程序员俱乐部  我要评论(0)
  • 摘要:我们在使用MVC的时候或许总是在使用着自己一直熟悉的知识点去实现已有的功能,多梳理一些知识点让每种功能的实现方式可以多样化.我们在开发小型系统时总是使用微软MVC的脚手架功能,比如路由可能就是使用了默认的路由,在稍微复杂或者大型的系统中其实我们可以自定义路由的.路由约束routes.MapRoute(name:"Language",url:"{language}/{controller}/{action}/{id}",defauts:new{controller="Home"
  • 标签:MVC

        我们在使用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可以指定区块代码,然后布局页可以引用被加载视图中的不同模块.

        从客户端提交数据      

class="brush:csharp;gutter:true;">@{
  @: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; }

       }

    再大的系统都是由零碎的知识点组成的,好的基础就是好的地基.

 

发表评论
用户名: 匿名