• [ASP.NET MVC] Model Binding With NameValueCollectionValueProvider


    [ASP.NET MVC] Model Binding With NameValueCollectionValueProvider

    范例下载

    范例程序代码:点此下载

    问题情景

    一般Web网站,都是以HTTP Request做为数据输入、HTTP Response做为数据输出,来完成一个网页要求响应的工作流程。

    而ASP.NET MVC所建构的网站,在收到HTTP Request封包之后,会依照HTTP Request封包的Request URL内容,来选择对应的Controller以及Action,并且透过Model Binding机制来将HTTP Request封包剖析成为Action的函式参数。最后ASP.NET MVC会使用这些函式参数来执行Action函式,并且依照Action执行结果以及对应的View内容,来产生HTTP Response封包回传给浏览器,藉此完成HTTP Request输入、HTTP Response输出的工作流程。

    本篇文章说明HTTP Request封包内容,如何被ASP.NET MVC的Model Binding机制使用,并且剖析成为Action的函式参数,为自己留个纪录也希望能帮助到有需要的开发人员。

    问题情景01

    数据源

    HTTP Request封包内容,如何被ASP.NET MVC的Model Binding机制使用,并且剖析成为Action的函式参数;这一连串的工作流程,可以从用户点击浏览器页面中Sumit按钮来开始说明。

    下列范例是一个HTML网页,这个网页中的Form窗体包含许多排版卷标、两个Text卷标以及一个 Submit标签。其中用来提供用户输入数据的两个Text卷标,名称分别为companyId及productId。

    <form action="/Receive/Echo_Multi_DataTypeArgument/" method="post">
    
        CompanyId : <input type="text" name="companyId" value="AAAAA" /><br />
        <br />
    
        ProductId : <input type="text" name="productId" value="BBBBB" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    数据源01

    当用户输入数据完毕之后,可使用鼠标点击页面上的Submit按钮,通知浏览器将Form窗体中的内容,封装成为HTTP Request封包来传送给Web服务器。

    在这个阶段,浏览器会将Form窗体中输入卷标的卷标名称、卷标内容,以Name-Value的方式编码成为一个数据字符串。接着依照Form窗体上所定义的Method模式,来将这个数据字符串封装成为HTTP Request封包。

    companyId=AAAAA&productId=BBBBB
    
    • 当Method模式定义为Post的时候,浏览器会将HTTP Request封包的Content-Type内容定义为application/x-www-form-urlencoded,并且将数据字符串设定为HTTP Request封包的Form Data内容。

      <form action="/Receive/Echo_Multi_DataTypeArgument/" method="post">
      
          CompanyId : <input type="text" name="companyId" value="AAAAA" /><br />
          <br />
      
          ProductId : <input type="text" name="productId" value="BBBBB" /><br />
          <br />
      
          <input type="submit" value="Submit" />
          <br />
      
      </form>
      

      数据源02

    • 当Method模式定义为Get的时候,浏览器会将数据字符串设定为HTTP Request封包的Query String内容。

      <form action="/Receive/Echo_Multi_DataTypeArgument/" method="get">
      
          CompanyId : <input type="text" name="companyId" value="AAAAA" /><br />
          <br />
      
          ProductId : <input type="text" name="productId" value="BBBBB" /><br />
          <br />
      
          <input type="submit" value="Submit" />
          <br />
      
      </form>
      

      数据源03

    服务器端的ASP.NET在收到HTTP Request封包之后,会撷取HTTP Request封包所定义的Form Data内容、Query String内容,以Name-Value的方式译码成为数据内容,并且使用这些数据内容建立为对应的NameValueCollection对象。

    • Form Data内容以Name-Value的方式译码成为数据内容之后,服务器端的ASP.NET会将数据内容建立为NameValueCollection对象,并且定义为System.Web.HttpContext.Current.Request.Form属性的内容。

      数据源04

    • Query String内容以Name-Value的方式译码成为数据内容之后,服务器端的ASP.NET会将数据内容建立为NameValueCollection对象,并且定义为System.Web.HttpContext.Current.Request.QueryString属性的内容。

      数据源05

    而这两个NameValueCollection物件,在ASP.NET MVC中会被统一封装成为NameValueCollectionValueProvider对象,来做为Model Binding机制的数据源。

    数据源06

    数据源07

    资料系结

    在ASP.NET MVC中使用NameValueCollectionValueProvider对象,做为Model Binding机制的数据源时,会依照下列规则来剖析NameValueCollectionValueProvider所提供的Name-Value数据内容,并且生成对应的Action函式参数。(为了降低学习曲线,空白前缀、数组跳号...等等进阶规则暂先排除。)

    单一值类型

    当Action函式,包含一个值类型的函式参数时。Model Binding核心会依照这个函式参数的「参数名称」作为Key数据,来从NameValueCollectionValueProvider对象中取得对应的Value数据,并且尝试将Value资料转型为函式参数的「参数型别」,当成功转型之后就生成一个「函式参数」。后续ASP.NET MVC就会使用这个函式参数执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Single_DataTypeArgument/" method="post">
    
        CompanyId : <input type="text" name="companyId" value="AAAAA" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结01

    资料系结02

    多个值类型

    当Action函式,包含多个值类型的函式参数时。Model Binding核心透过生成单一值类型的流程,依序生成每个对应「参数名称」的函式参数。后续ASP.NET MVC就会使用这些函式参数执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Multi_DataTypeArgument/" method="post">
    
        CompanyId : <input type="text" name="companyId" value="AAAAA" /><br />
        <br />
    
        ProductId : <input type="text" name="productId" value="BBBBB" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结03

    资料系结04

    值类型集合

    当Action函式,包含值类型集合的函式参数时。Model Binding核心会依照这个函式参数的「参数名称」作为Prefix数据,来从NameValueCollectionValueProvider对象中取得所有符合「Prefix数据[索引]」格式的一组Key数据。接着Model Binding核心会先依照函式参数的「参数型别」建立一个集合,并且透过生成单一值类型的流程,依序生成每个对应「Key数据」的数据,来做为这个集合的项目。最后ASP.NET MVC就会使用这个集合作为函式参数来执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Array_DataTypeArgument/" method="post">
    
        CompanyIdArray[0] : <input type="text" name="companyIdArray[0]" value="AAAAA" /><br />
        CompanyIdArray[1] : <input type="text" name="companyIdArray[1]" value="BBBBB" /><br />
        <br />
    
        ProductIdArray[0] : <input type="text" name="productIdArray[0]" value="CCCCC" /><br />
        ProductIdArray[1] : <input type="text" name="productIdArray[1]" value="DDDDD" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结05

    资料系结06

    单一参考型别

    当Action函式,包含一个参考型别的函式参数时。Model Binding核心会先依照函式参数的「参数型别」建立一个对象,并且依序将函式参数的「参数名称」、对象的「属性名称」,组合成为「参数名称.属性名称」格式的Key数据,接着透过生成单一值类型的流程,依序生成每个对应「Key数据」的对象属性。最后ASP.NET MVC就会使用这个对象作为函式参数来执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Single_ObjectTypeArgument/" method="post">
    
        Company.Id = <input type="text" name="company.Id" value="AAAAA" /><br />
        Company.Name = <input type="text" name="company.Name" value="BBBBB" /><br />
        Company.Address = <input type="text" name="company.Address" value="12345" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结07

    资料系结08

    多个参考型别

    当Action函式,包含多个参考型别的函式参数时。Model Binding核心透过生成单一参考型别的流程,依序生成每个对应「参数名称」的函式参数。后续ASP.NET MVC就会使用这些函式参数执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Multi_ObjectTypeArgument/" method="post">
    
        Company.Id = <input type="text" name="company.Id" value="AAAAA" /><br />
        Company.Name = <input type="text" name="company.Name" value="BBBBB" /><br />
        Company.Address = <input type="text" name="company.Address" value="12345" /><br />
        <br />
    
        Product.Id = <input type="text" name="product.Id" value="CCCCC" /><br />
        Pproduct.Name = <input type="text" name="product.Name" value="DDDDD" /><br />
        Product.Price = <input type="text" name="product.Price" value="67890" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结09

    资料系结10

    参考型别集合

    当Action函式,包含参考型别集合的函式参数时。Model Binding核心会依照这个函式参数的「参数名称」作为Prefix数据,来从NameValueCollectionValueProvider对象中取得所有符合「Prefix数据[索引]」格式的一组Key数据。接着Model Binding核心会先依照函式参数的「参数型别」建立一个集合,并且透过生成单一参考型别的流程,依序生成每个对应「Key数据」的数据,来做为这个集合的项目。最后ASP.NET MVC就会使用这个集合作为函式参数来执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Array_ObjectTypeArgument/" method="post">
    
        CompanyArray[0].Id = <input type="text" name="companyArray[0].Id" value="AAAAA" /><br />
        CompanyArray[0].Name = <input type="text" name="companyArray[0].Name" value="BBBBB" /><br />
        CompanyArray[0].Address = <input type="text" name="companyArray[0].Address" value="12345" /><br />
    
        CompanyArray[1].Id = <input type="text" name="companyArray[1].Id" value="CCCCC" /><br />
        CompanyArray[1].Name = <input type="text" name="companyArray[1].Name" value="DDDDD" /><br />
        CompanyArray[1].Address = <input type="text" name="companyArray[1].Address" value="67890" /><br />
        <br />
    
        ProductArray[0].Id = <input type="text" name="productArray[0].Id" value="EEEEE" /><br />
        ProductArray[0].Name = <input type="text" name="productArray[0].Name" value="FFFFF" /><br />
        ProductArray[0].Price = <input type="text" name="productArray[0].Price" value="54321" /><br />
    
        ProductArray[1].Id = <input type="text" name="productArray[1].Id" value="GGGGG" /><br />
        ProductArray[1].Name = <input type="text" name="productArray[1].Name" value="HHHHH" /><br />
        ProductArray[1].Price = <input type="text" name="productArray[1].Price" value="09876" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结11

    资料系结12

    多个混合型别

    当Action函式,包含多个值类型、参考型别的函式参数时。Model Binding核心会依需透过生成单一值类型、生成单一参考型别的流程,依序生成每个对应「参数名称」的函式参数。后续ASP.NET MVC就会使用这些函式参数执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Multi_MixTypeArgument/" method="post">
    
        CompanyId : <input type="text" name="companyId" value="AAAAA" /><br />
        <br />
    
        Product.Id = <input type="text" name="product.Id" value="BBBBB" /><br />
        Product.Name = <input type="text" name="product.Name" value="CCCCC" /><br />
        Product.Price = <input type="text" name="product.Price" value="12345" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结13

    资料系结14

    混合型别集合

    当Action函式,包含多个值类型集合、参考型别集合的函式参数时。Model Binding核心会依需透过生成值类型集合、生成参考型别集合的流程,依序生成每个对应「参数名称」的函式参数。后续ASP.NET MVC就会使用这些函式参数执行Action函式,并且完成接续的工作流程来产生HTTP Response封包回传给浏览器。

    <form action="/Receive/Echo_Array_MixTypeArgument/" method="post">
    
        CompanyIdArray[0] : <input type="text" name="companyIdArray[0]" value="AAAAA" /><br />
        CompanyIdArray[1] : <input type="text" name="companyIdArray[1]" value="BBBBB" /><br />
        <br />
    
        ProductArray[0].Id = <input type="text" name="productArray[0].Id" value="CCCCC" /><br />
        ProductArray[0].Name = <input type="text" name="productArray[0].Name" value="DDDDD" /><br />
        ProductArray[0].Price = <input type="text" name="productArray[0].Price" value="12345" /><br />
    
        ProductArray[1].Id = <input type="text" name="productArray[1].Id" value="EEEEE" /><br />
        ProductArray[1].Name = <input type="text" name="productArray[1].Name" value="FFFFF" /><br />
        ProductArray[1].Price = <input type="text" name="productArray[1].Price" value="67890" /><br />
        <br />
    
        <input type="submit" value="Submit" />
        <br />
    
    </form>
    

    资料系结15

    资料系结16

    参考数据

  • 相关阅读:
    关于协同过滤技术
    一些数据上的概念
    Simple HBase query bridge
    leveraging
    Ajax.NET
    怎样实现给DEDE的栏目增加栏目图片(2)
    怎样实现给DEDE的栏目增加栏目图片(1)
    更改dede网站地图模板样式
    sublime如何实现函数折叠
    一步一步CCNA之五:交换机vlan配置
  • 原文地址:https://www.cnblogs.com/clark159/p/3690312.html
Copyright © 2020-2023  润新知