是否可以在控制器中使用UpdateModel来填充对象?

时间:2014-05-01 12:30:42

标签: c# asp.net-mvc

是否可以在MVC控制器中有效地执行此类操作:

var vmObject = Activator.CreateInstance("A string representing the model that was posted");
//vmObject is of type object
TryUpdateModel(vmObject);// this would populate the object with the posted values, so that later on I could cast the object to strongly typed model similar to what was posted (not currently working)

//elsewhere in code (ie in a service that is injected into the controller)
var stronglyTypedVM = (MyViewModel)vmObject;//this instance would be populated with values from the controller

原因是控制器不知道将在编译时发布的视图模型的类型,但是注入它的服务会这样做。

到目前为止,我无法让TryUpdateModel使用对象(似乎没有任何内容填充)。

有没有办法从发布的值中填充此对象?我完全错误地采取了这种方式吗?任何人都可以提出更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:9)

是的,我一直都在使用这个技巧:

TryUpdateModel((dynamic)vmObject);

您遇到问题的原因是TryUpdateModel是一种通用类型的方法,它使用泛型类型来确定它应该查找哪些属性。例如,如果您只想绑定在接口上声明的特定属性,这可能很有用。但是,如果您在编译时知道它只是object,那么它就不知道可以绑定在object上的任何属性。

通过将对象转换为dynamic,您可以允许系统根据对象的运行时类型确定在运行时使用的最合适的通用签名。它与使用反射生成和调用自定义通用方法签名相同,但它更简洁(并且性能稍好)。