模型绑定和泛化

时间:2011-06-24 06:23:54

标签: oop asp.net-mvc-2 inheritance binding

我有一个模型,其中ClassC继承自classB。

ClassB的

int b1
string b2

ClassC:ClassB

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实例?它没有给出任何错误!模型绑定器在内部做错了吗?在这种情况下,如何在我的控制器中获取此属性?有什么建议吗?感谢..

1 个答案:

答案 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的值不是来自先前的请求。它更像是由模型绑定器绑定到你的动作参数。