代码之家  ›  专栏  ›  技术社区  ›  Andrew Flanagan

ASP.NET MVC:默认模型绑定器不在Safari上工作(但在Firefox上工作)

  •  1
  • Andrew Flanagan  · 技术社区  · 15 年前

    非常奇怪的问题…我的控制器里有这样的东西:

    public ActionResult Initialize(IEnumerable<MyModel> Requests)
    {
    ...
    
    }
    

    我在提交视图中生成如下表单元素:

    Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Name
    Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Address
    Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Name
    Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Address
    

    在火狐上,当我用多个元素提交这个文件时,绑定器工作,我得到一个对象集合。在Safari上,完全相同的数据总是在集合中只生成一个对象。

    奇怪的是,在调试器中,如果我查看requests.params.allkeys[],我会看到这些值——它们正在被提交,只是不知何故没有绑定。我在火狐上使用Firebug,但没有一个与之相当的Safari工具。因为我在request.params中看到了值,所以我假设传入表单值并不是问题——只是一些关于它们绑定到视图模型的方式的问题……

    活页夹对我来说是一种黑色的魔法——我不知道它生活在哪里,也不知道我是否能跨过它去看看它在做什么。

    你知道这可能是什么吗?或者我该怎么追查?

    编辑: 这在IE中也能正常工作——只是Safari有点奇怪。

    编辑2: 我撒了谎…Safari不会像我预期的那样发布索引值:

    Requests.index = {GUID}
    Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Name
    Requests[90ed54f6-4650-44c7-8cc2-c4d225a9a334].Address
    Requests.index = {GUID}
    Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Name
    Requests[db67e8e5-94f8-4b35-b69c-65184980f2a1].Address
    

    Firefox和Internet Explorer都发布 Requests.index 值以逗号分隔,但Safari只发布第一个值。我不知道这个案子的“正确”是什么,但这是我能全力以赴的。

    3 回复  |  直到 15 年前
        1
  •  1
  •   tvanfosson    15 年前

    我假设“索引”是一个guid,作为请求的ID。我假设您实际上会生成如下内容:

     <input type="hidden" name="Requests[0].ID" value="90ed54f6-4650-44c7-8cc2-c4d225a9a334" />
     <input type="text" name="Requests[0].Name" />
     <input type="text" name="Requests[0].Address" />
    

    当然,您的myModel类需要具有id属性来保存guid。

    我的怀疑是,它与查询参数的编码方式有关,但老实说,我从来没有像您那样设置集合,而且我也不清楚模型绑定器应该如何解释参数索引——也许它是将它们全部映射到0上——如果不是数字的话。

        2
  •  0
  •   Tyler Jensen    15 年前

    比较每个浏览器发布的实际值:

    public ActionResult Initialize(FormCollection collection)
    {
      //... dump the collection's NameValueCollection ...
    }
    

    并在浏览器之间比较表单的实际HTML呈现,以确保这一点。

        3
  •  0
  •   Andrew Flanagan    15 年前

    所以最终的解决办法是不正确的放置 <input> 标签。具体来说,我把 <输入& GT; 后一 <tr> 在一个 <td> . 在火狐和IE上,这是非常宽容的,这是有效的。在Safari上,出于某种原因,它不认为第二个nth元素是有效的表单输入。放 <输入& GT; 中的元素 <TD & GT; 适用于所有浏览器。

    谢谢你们的帮助。