gpt4 book ai didi

c# - 为什么在 EditorTemplate 中呈现集合时会得到错误的表单元素名称?

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:32 24 4
gpt4 key购买 nike

在我当前的项目中,我有几个包含 subview 模型集合的 View 模型实例,如下所示:

public class ParentViewModel
{
public ParentViewModel()
{
Children = new List<ChildViewModel>();
}

public List<ChildViewModel> Children { get; set; }
}

public class ChildViewModel
{
public string Name { get; set; }
public int Age { get; set; }
}

subview 模型中的数据可以在创建和更新表单中使用。考虑到这一点,我一直在尝试使用 EditorFor 为这些 subview 模型集合生成表单元素。

我知道如果创建一个 EditorTemplate 并像这样简单地将集合提供给 EditorFor:

@Html.EditorFor(vm => vm.Children)

EditorFor 将自动遍历集合并将 EditorTemplate 应用于每个单独的项目。我遇到的问题是,我是否应该希望对每三个项目执行某些操作,将两个项目呈现到同一表格行中,或者我需要强制 EditorFor 使用特定的 EditorTemplate 的其他变体,这很好除了出现一个奇怪的问题。

这是我的测试EditorTemplate

@model List<Sandbox.Models.ChildViewModel>

<table>
@for(int i = 0, j = 1; i < Model.Count - 1; i+=2)
{
<tr>
<td>
@Html.TextBoxFor(o => o[i].Age)
</td>
@if(j < Model.Count)
{
<td>
@Html.TextBoxFor(o => o[j].Age)
</td>
}
</tr>
}
</table>

以及包含 EditorFor 调用的 View

@model Sandbox.Models.ParentViewModel

<html>
<head>
<title>title</title>
</head>
<body>
<div>
@using(Html.BeginForm()) {
@Html.EditorFor(o => o.Children, "ChildrenTemplate")
<input type="submit" />
}
</div>
</body>
</html>

当使用上述EditorTemplate 生成表单时,由EditorTemplate 生成的表单元素具有格式错误的name 属性。他们应该在哪里

Children[1].Age

他们是

Children.[1].Age

这会使模型绑定(bind)器完全崩溃,并且它将拒绝在提交表单时重新填充父 View 模型。

我能够解决这个问题的唯一方法是使 EditorTemplate 的模型成为父 View 模型而不是 subview 模型列表,这严重限制了我使用模板的能力,因为我可能有多个我拥有相同 subview 模型集合的位置,我没有包含它的相同父模型。

此时,我知道以下选项:

  1. 将 EditorTemplate 的模型更改为父 View 模型,这限制了重用模板的能力。
  2. 创建自定义模型绑定(bind)器或操作过滤器,以尝试在模型绑定(bind)器发现问题之前清理表单名称。
  3. 弄清楚如何使当前设置正常工作。

感谢所有帮助。

最佳答案

你可以像这样改变你的代码

包含 EditorFor 调用的 View

<table>
@for (int i = 0; i < Model.Children.Count; i++)
{
@Html.EditorFor(o => o.Children[i]) //also you could mention the template name
}
</table>

这是我的测试EditorTemplate

@model Sandbox.Models.ChildViewModel

<tr>
<td>
@Html.TextBoxFor(o => o.Name)
</td>
<td>
@Html.TextBoxFor(o => o.Age)
</td>
</tr>

更多详情 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspxhttp://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

关于c# - 为什么在 EditorTemplate 中呈现集合时会得到错误的表单元素名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com