我最近发现,如果我说:
object latestPosts = new MyApp.Models.LatestPosts();
TryUpdateModel(latestPosts);
latestPosts对象不会更新。这是由于找到问题here。使用变通方法解决了这个问题。但是,如果我将latestPosts移动为现有类型(例如Widget)的属性(称为Parameters),则它不会更新模型。 E.g。
var widget = new Widget();
MyTryUpdateModel(widget, "Widget", null, null, ValueProvider); // LatestPosts doesn't update
但以下确实有效:
MyTryUpdateModel(widget.Parameters, "Widget.Parameters", null, null, ValueProvider);
编辑:这是Widget类:
public class Widget {
[Required, StringLength(100)]
public virtual string Name { get; set; }
private object _parameters;
public virtual object Parameters {
get {
// Code removed for brevity
if (_parameters == null)
_parameters = new MyApp.Models.LatestPosts();
return _parameters;
} set { _parameters = value; }
}
}
这是LatestPosts课程:
public class LatestPosts {
public int NumPosts { get; set; }
}
我无法理解为什么初始的MyTryUpdateModel不能用于更新整个Widget,因为它应该处理复杂的类型。如果有人能对这个问题有所了解,我会很感激。
由于
答案 0 :(得分:0)
我会explaim两个原因,原来TryUpdateModel不起作用,为什么“修补TryUpdateNode不工作你的情况,我是一个包含复杂的自定义模型绑定MVC的控件工具包的协调,所以我们收购了熟悉模型Binder及其背后的问题。
默认TryUpdateModel:它只是调用DefaultModelBinder。现在根据模型绑定过程中获得的信息确定运行时的类型是有风险的,因为这些信息来自客户端,可能会被恶意用户操纵,这样可能会强制模型绑定器创建类型的实例他决定......风险很大......他可能利用这个来强制模型绑定器执行“假”类型构造函数中的恶意代码。因此,一般设计选择是模型绑定器使用的所有类型必须在编译时确定
MyTryUpdateModel:它只是通过调用GetType来确定根模型的类型,然后使用此信息来调用此类型的默认模型绑定器。但是,除了这个initia“启动”之外,Model Binder正常工作....这是......根模型的属性类型,不是通过GetType或运行时信息获得,而是通过检查根模型的属性类型...在您的情况下是对象...这意味着没有信息。
MVC的控件工具包的defaul自定义模型粘结剂在运行时确定类型的工具......但不是所有TYPES..because THI暴露在attcks的风险......这是“安全”类型的亚型类型。 .for实现接口的实例类型。