我有一个模型,其中ClassC继承自classB。
int b1
string b2
bool c1
int c2
string c3
我的观点与ClassB绑定。当我第一次填充模型数据时,由于业务需要,我将ClassC的实例分配给ClassB的变量,然后将其发送到view。因为ClassC毕竟是ClassB。
在我看来,我需要检查属性c1的值,并相应地使div可见/不可见。所以我通过以下代码访问此属性
(模型为ClassC).c1
这很好但只是第一次。当我提交页面时,控制器的参数接受类型为ClassB的模型。
public virtual ActionResult Save(ClassB classb)
但是当我尝试在这里访问相同的属性时,相同的代码会给出类型转换的错误。 理想情况下,ClassB的参数是否应该包含在填充视图时分配给它的ClassC实例?它没有给出任何错误!模型绑定器在内部做错了吗?在这种情况下,如何在我的控制器中获取此属性?有什么建议吗?感谢..
答案 0 :(得分:0)
模型绑定器内部是否有任何错误?
没有ModelBinding正在完成它所训练的任务。 modelbinder的工作大致是获取你的动作参数并从不同的来源填充它们(Fomr post,json,routevalue dictionary等)。由于action方法的参数是ClassB,它不包含ClassC的属性(方法和字段),因此它不会填充这些属性。此外,如果要在操作方法中访问ClassC,则必须将其更改为
public virtual ActionResult Save(ClassC classc)
{
}
正如您所说,您正在使用ClassC(c1)的属性来显示/隐藏页面上的div。但是如果你想要将Classc的属性绑定到模型,你必须将它们放在表单字段(输入,选择,复选框等)中,以便在提交表单时随访请求。
理想情况下,ClassB的参数是否应该包含在填充视图时分配给它的ClassC实例?
不,它不应该因为当呈现视图并且html被传递给用户时,所有内容(Model,RequestContext等)都消失了,当您提交表单时,它完全是一个新请求,并且不应该包含模型值从以前的请求。您在操作方法中看到的ClassB的值不是来自先前的请求。它更像是由模型绑定器绑定到你的动作参数。