• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NETCore高级系列(一)【中】:模型绑定

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
此为系列文章,对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"

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net文件压缩zip下载发布时间:2022-07-10
下一篇:
ASP.NETMVC前端(View)向后端(Controller)中传值发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap