模型绑定 - 运行时类型

时间:2012-03-02 15:53:44

标签: asp.net-mvc model-binding

我最近发现,如果我说:

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,因为它应该处理复杂的类型。如果有人能对这个问题有所了解,我会很感激。

由于

1 个答案:

答案 0 :(得分:0)

我会explaim两个原因,原来TryUpdateModel不起作用,为什么“修补TryUpdateNode不工作你的情况,我是一个包含复杂的自定义模型绑定MVC的控件工具包的协调,所以我们收购了熟悉模型Binder及其背后的问题。

默认TryUpdateModel:它只是调用DefaultModelBinder。现在根据模型绑定过程中获得的信息确定运行时的类型是有风险的,因为这些信息来自客户端,可能会被恶意用户操纵,这样可能会强制模型绑定器创建类型的实例他决定......风险很大......他可能利用这个来强制模型绑定器执行“假”类型构造函数中的恶意代码。因此,一般设计选择是模型绑定器使用的所有类型必须在编译时确定

MyTryUpdateModel:它只是通过调用GetType来确定根模型的类型,然后使用此信息来调用此类型的默认模型绑定器。但是,除了这个initia“启动”之外,Model Binder正常工作....这是......根模型的属性类型,不是通过GetType或运行时信息获得,而是通过检查根模型的属性类型...在您的情况下是对象...这意味着没有信息。

MVC的控件工具包的defaul自定义模型粘结剂在运行时确定类型的工具......但不是所有TYPES..because THI暴露在attcks的风险......这是“安全”类型的亚型类型。 .for实现接口的实例类型。