2012-04-15 62 views
1

在asp.net mvc3中,我想要一个通用的方法,它将视图模型对象添加到数据库中,无论数据库发送到数据库中的哪个位置。要做到这一点,我试图通过发布的模型。不过,我动态地做这件事有点困难。我试过,但没有奏效:我可以动态发布视图模型吗?

观点:

(psuedo) 
begin form aiming at Add 
fields 
input type = submit 

控制器动作

[HttpPost] 
public ActionResult Add(dynamic model,...) 

问题是模型是永远不会填满。隐藏的字段是,但模型用助手定义的实际字段不会进入模型。我知道只是将它命名为model很可能不会排列正确。我敢肯定,如果我强烈地键入模型,如(MyExplicitClass model,...),它会工作,但这会破坏动态方法,因为我希望能够发送class1,class2,class3,class5,class8,class13等。

Is there任何方式得到这个工作,无论发送什么@model class21dynamic model(或equiv)都会捕获该对象?

回答

2

不,至少不是没有使用自定义模型联编程序。

您对模型绑定的工作原理有一个基本的误解。您认为模型绑定基于视图中的@model工作。这不可能离真相更远。模型绑定通过查看action方法中指定的参数来工作。

所有的模型绑定器都在查看为action方法指定的参数类型,然后查看Request值(querystring或post)并尝试匹配它们。如果它发现匹配,它将实例化对象。

这里的关键是模型联编程序仅实例化在action方法的参数中指定的对象。什么对象是“动态”?它不知道。因此它不能创建任何类型。

编辑:

你会发现这个问题非常有用

Polymorphic model binding

+0

如果我把一个过滤器来推断,然后投的类型?这可以工作吗? – 2012-04-15 21:34:35

+0

@TravisJ - 过滤器(假设你是一个属性)在编译时被静态绑定。他们不会在运行时工作,所以无法在运行时更改过滤器。 – 2012-04-15 21:39:02

+0

可以通过绑定蹦跳,并在运行时使用动态创建的静态类型的副本来完成。 – 2012-04-15 21:39:54

相关问题