绑定到已知类型的对象列表

时间:2014-09-12 12:46:44

标签: c# asp.net-mvc asp.net-mvc-4 model-binding

我有以下用作视图模型属性的包装类:

public abstract class MultipleFormsModel
{
    public class FormModel
    {
        public int SelectedValue { get; set; }
        public object Model { get; set; }
    }
    public int FormSelector { get; set; }
    public List<FormModel> Models { get; set; }
}
public class MultipleFormsModel<T1, T2> : MultipleFormsModel
{
    public MultipleFormsModel() {}
    public MultipleFormsModel(int val1, T1 model1, int val2, T2 model2)
    {
        Models.Add(new FormModel() { SelectedValue = val1, Model = model1 });
        Models.Add(new FormModel() { SelectedValue = val2, Model = model2 });
    }
}

然后我有一些模型,它使用上面提到的包装类。

public class ViewModel
{
    //... other properties
    public MultipleFormsModel<SomeModel1, SomeModel2> MultipleModels { get; set; }

    public ViewModel()
    {
        MultipleModels = new MultipleFormsModel<SomeModel1, SomeModel2>(0, new SomeModel1(), 1, new SomeModel2());
    }
}

此模型将传递到视图并使用@Html.EditorForModel()调用显示。当然,有一些用于MultipleFormsModel和FormModel的模板,它们只绘制了重要的部分,但这对主题来说并不重要。 回传表单时会出现问题。值未绑定到模型ViewModel中。 (是的,表格中输入的名称和ID是正确的)

我的猜测是它是由于默认模型绑定器将ViewModel.Models[x].Model视为类型object,它没有属性。但正如您可能会看到它被创建为具体类型(SomeModel1SomeModel2)。 我读了这个paper,我怀疑原因隐藏在下面的文字中:

  

接下来,AbstractModelBinder使用具体类型名称生成一组新的元数据,用于描述具体类的详细信息。 AbstractModelBinder使用这个新的元数据来替换描述初始抽象模型类型的现有ModelMetadata属性,从而有效地使模型绑定器忘记它始终绑定到非具体类型。

这里的问题是,我不知道从哪里开始。我需要的是让DefaultModelBinder将属性类型视为真实,而不是声明的类型 - 它是否可能?

0 个答案:

没有答案