zoukankan      html  css  js  c++  java
  • [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

    参考数据

  • 相关阅读:
    与众不同 windows phone (50)
    与众不同 windows phone (49)
    重新想象 Windows 8.1 Store Apps (93)
    重新想象 Windows 8.1 Store Apps 系列文章索引
    重新想象 Windows 8.1 Store Apps (92)
    重新想象 Windows 8.1 Store Apps (91)
    重新想象 Windows 8.1 Store Apps (90)
    重新想象 Windows 8.1 Store Apps (89)
    重新想象 Windows 8.1 Store Apps (88)
    重新想象 Windows 8.1 Store Apps (87)
  • 原文地址:https://www.cnblogs.com/clark159/p/3690312.html
Copyright © 2011-2022 走看看