zoukankan      html  css  js  c++  java
  • ASP.NET Core 高级系列(一)【中】:模型绑定

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解。

    简单类型

          模型绑定器能将源字符串转换为其本身的简单类型包含如下:      

    复杂类型

           一个复杂类型必须有一个public 默认的构造函数以及一些public的可读写的属性用来进行绑定。当模型绑定发生时,复杂类型会用public 默认构造函数进行实例化。

           对于复杂类型的每个属性,模型绑定为名称模式 prefix.property_name 来查找源。如果没有找到,它便会查找property_name 而忽略前缀。

           对于绑定到一个参数来说,前缀将会是参数的名称。对于绑定到一个 PageModel public 属性来说,前缀将会是public 的属性名称。一些属性(attributes)会包含一个Prefix 属性,其允许你重写参数或者属性名的默认用法。

           举个例子,假设复杂类型是如下的Instructor 类:

    public class Instructor
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
    }

           前缀 = 参数名

           如果将要绑定的模型是名为 instructorToUpdate 的参数:

    public IActionResult OnPost(int? id, Instructor instructorToUpdate)

          模型绑定为键  instructorToUpdate.ID 来查找绑定源。如果没有找到,它将查找ID,而不带任何前缀。

          前缀 = 属性名

          如果将要被绑定的模型是名为控制器或者PageModel 类的 名为Instructor 的属性:

    [BindProperty]
    public Instructor Instructor { get; set; }

          模型绑定便为键 Instructor.ID 来寻找绑定源,如果没有找到,其便会查找 ID,而不带任何前缀。

          自定义前缀

          如果将要被绑定的模型是名为 instructorToUpdate 的参数并且 Bind 特性指定了 Instructor 作为前缀:

    public IActionResult OnPost(
        int? id, [Bind(Prefix = "Instructor")] Instructor instructorToUpdate)

          模型绑定便会为键 Instructor.ID 查找绑定源。如果没有找到,它便会查找ID。

          用于复杂类型目标特性

          一些特性可用来控制复杂类型的模型绑定:

    • [BindRequired]
    • [BindNever]
    • [Bind]

           当绑定源是posted 表单数据时,这些特性会影响模型绑定。它们不会影响输入格式化器,其会处理posted JSON数据以及XML请求体。s呼入格式化器将在本章后面会解释到。同样也可以在Model validation 中 看到对于 [Required] 特性的讨论。

           [BindRequired] 特性:仅仅可以被应用到模型的属性上,而不能应用到方法的参数上。如果绑定在模型属性上不能发生的话,会导致模型绑定添加一个模型状态错误。这儿有一个示例:

    public class InstructorWithCollection
    {
        public int ID { get; set; }
    
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Hire Date")]
        [BindRequired]
        public DateTime HireDate { get; set; }

            [BindNever] 特性:仅仅可以被应用到模型属性,而不能被应用到方法参数上。其用来阻止模型绑定设置一个模型的属性。这儿有一个示例:

    public class InstructorWithDictionary
    {
        [BindNever]
        public int ID { get; set; }

            [Bind] 特性:可以被应用于一个类或者方法的参数。指定了一个模型的哪些属性应该被包含在模型绑定中。在如下的示例中,只有Instructor模型的特定属性会进行绑定,不管其是作为方法参数或者是 公共属性来使用:

    [Bind("LastName,FirstMidName,HireDate")]
    public class Instructor

           在如下的示例中,当OnPost方法被调用时,只有Instructor模型的特定属性会进行绑定:

    [HttpPost]
    public IActionResult OnPost([Bind("LastName,FirstMidName,HireDate")] Instructor instructor)

           [Bind] 特性可以被用来在 Create 场景下阻止 overposting。然而在 Edit 场景下其不会正常工作,这是因为被排除的属性被设置为 null 或者默认值,而不是保持不被修改。对于阻止overposting,更建议的是 视图模型 而不是 [Bind] 特性。更多信息,请参考 Security note about overposting

    集合 

          对于是简单类型的集合的目标类型来说,模型绑定为 parameter_name 或者   property_name 来查找匹配。如果没有找到匹配,它会查找支持的格式之一,而不带任何前缀。举个例子: 

    • 假设要绑定的参数是一个名为 selectedCourses 的数组。
    public IActionResult OnPost(int? id, int[] selectedCourses)
    • 表单或者查询字符串数据可以是如下格式之一
      selectedCourses=1050&selectedCourses=2000 
      selectedCourses[0]=1050&selectedCourses[1]=2000
      [0]=1050&[1]=2000
      selectedCourses[a]=1050&selectedCourses[b]=2000&selectedCourses.index=a&selectedCourses.index=
      [a]=1050&[b]=2000&index=a&index=b
    • 如下格式仅在表单数据中支持:
    selectedCourses[]=1050&selecte r_name 或者 property_name 寻找匹配。如果没有找到任何匹配,它会查找支持的格式之一,而不带任何前缀。
    • 假设目标参数是一个名为selectedCourses 的Dictionary<int, string> :
    public IActionResult OnPost(int? id, Dictionary<int, string> selectedCourses)
    • posted 表单数据或者查询字符串数据 看起来如同是如下格式之一:

              selectedCourses[1050]=Chemistry&selectedCourses[2000]=Economics

              [1050]=Chemistry&selectedCourses[2000]=Economics

              selectedCourses[0].Key=1050&selectedCourses[0].Value=Chemistry& selectedCourses[1].Key=2000&selectedCourses[1].Value=Economics

              [0].Key=1050&[0].Value=Chemistry&[1].Key=2000&[1].Value=Economics

    • 对于如上所有的示例格式,模型绑定会传递两个条目的字典给 selectedCourses 参数
      • selectedCourses["1050"]="Chemistry"
      • selectedCourses["2000"]="Economics"
  • 相关阅读:
    SharePoint Framework (SPFx) 开发入门教程
    SharePoint 2013 Designer 入门教程
    SharePoint 2013 开发教程
    SharePoint 2013 入门教程
    SharePoint Online 部署SPFx Web部件
    SharePoint Online SPFx Web部件绑定数据
    SharePoint Online 创建SPFx客户端Web部件
    SharePoint Online 配置框架(SPFx)开发环境
    SharePoint Online 创建应用程序目录
    SharePoint Online 启用 IRM
  • 原文地址:https://www.cnblogs.com/qianxingmu/p/12628904.html
Copyright © 2011-2022 走看看