MVC在编辑器中转换

本文关键字:转换 编辑器 MVC | 更新日期: 2023-09-27 18:20:22

如果在编辑器模板内进行强制转换,如何正确绑定到模型?输入的名称会是什么样子?

所以我有一点复杂的Model,其中一个属性是一个类,例如Shape,它被其他类扩展,例如SquareCircle。因此,我在尝试绑定到Model:的Shape属性时遇到了问题

@Html.RadioButtonFor(m => (m.Shape as Square).Something, "Yes")
@Html.RadioButtonFor(m => (m.Shape as Square).Something, "No")

POST请求中,Shape属性在模型中显示为null

有人能把我推向正确的方向吗?输入的formcollection键应该是什么样子的???

MVC在编辑器中转换

MVC处理这些lambda表达式的方式有点奇怪,它从来没有按原样运行或使用lambda函数。相反,它将其分解为表达式组件,并选择用于数据绑定的参数名称(以及getters/ssetters等的MethodInfo)。

不幸的是,你的复杂表达式破坏了他们的算法。这很好,它意味着快速,而不是非常灵活。

至于修复,我只需要添加一个Square属性(public Square SquareAccessor => Shape as Square;)并绑定到它。我在这里假设,如果您到达该分支,那么您假设强制转换是有效的,如果没有抛出一些null检查。

我在上面找到的唯一解决方法是将其转换为视图变量,该变量的名称正是您在"name"属性中需要的名称

@{
  var Shape = Model.Shape as Square;
}
@Html.RadioButtonFor(m => Shape.Something, "Yes")
@Html.RadioButtonFor(m => Shape.Something, "No")

通过这种方式,html将被正确呈现,但这仍然是一种变通方法-不是一个干净的解决方案