【问题标题】:.NET MVC Multiple Versions of Same form on One View.NET MVC 在一个视图上具有相同表单的多个版本
【发布时间】:2009-07-08 12:57:44
【问题描述】:

我的网站有一个部分,用户可以在其中向他们的帐户添加地址。他们可以根据需要添加任意数量(运输、计费等)。

我进行了设置,以便在添加地址后,用户可以在带有“保存”和“删除”按钮的更新表单中看到该地址。用户可以调整他们添加的任何地址。

我遇到的问题是验证。假设需要第 1 行。如果我要更新三个地址中的第二个并将第 1 行留空,则控制器会引发错误(使用来自 Nerd Dinner 的相同技术,顺便说一句)。这很好。糟糕的是,视图中列出的所有地址的所有地址信息现在都显示为引发错误的地址的值。

我知道这与模型绑定有关,但我很困惑,因为表单数据设置如下:

<%= Html.TextBox("Line1", Model.Address.Line1)%>

传入的模型对于我们在客户端地址列表中的地址是唯一的。我不确定为什么“Model.Addres.Line1”中的值被 ModelState ModelErrors 集合中的数据覆盖。我猜默认行为是在错误集合中使用它们存在的值。当视图上有多个表单并且表单使用与其他每个表单相同的输入字段名称时,这是一个问题。

我唯一的解决方法是在此处避免 Html Helper 函数并在 HTML 中对输入进行硬编码吗?

【问题讨论】:

    标签: asp.net-mvc binding model


    【解决方案1】:

    如果你错了,请纠正我,但听起来所有 3 个地址都将在相同的表单中具有相同的字段名称?如果是这样,那么您遇到的问题不仅仅是验证消息。

    无论如何(即使您使用单独的表格),我建议您在字段名称前加上地址 ID:

    <%= Html.TextBox("Address" + Model.Address.ID + ".Line1", Model.Address.Line1)%>
    

    您将无法自动绑定(在方法参数中),但您可以使用 UpdateModel() 并将前缀设置为

    "Address" + Address.ID
    

    【讨论】:

    • 每个地址都有一个单独的表格。如果我在字段名前加上唯一 ID,那么我将丢失控制器中更新所需的模型绑定。顺便说一句,当没有验证错误时,更新成功。我只会在发生错误时遇到问题。
    • 是的,您确实失去了自动模型绑定。如果要保留它,则必须具有三个模型绑定(其中两个始终为空)-绑定也有一个前缀选项。或者,您可以做两件事: a) 仅显示提交表单的 validationMessage()。不要为尚未提交的地址调用validationMessage()。但是,视图会有点混乱。 b) 保持 Html.TextBox() 相同,但仅向 ValidationMessage() 添加前缀。在你的控制器中做一些事情来重命名视图状态中的验证错误。也很乱。
    【解决方案2】:

    我通过去掉表单上的 html 辅助方法解决了这个问题。如果有人看到保留辅助方法的方法,请告诉我。

    【讨论】:

    • 刚刚看到上面的帖子更新了解决方案。我不知道 UpdateModel 方法上的前缀选项。谢谢。
    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多