我有以下用作视图模型属性的包装类:
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
,它没有属性。但正如您可能会看到它被创建为具体类型(SomeModel1
或SomeModel2
)。
我读了这个paper,我怀疑原因隐藏在下面的文字中:
接下来,AbstractModelBinder使用具体类型名称生成一组新的元数据,用于描述具体类的详细信息。 AbstractModelBinder使用这个新的元数据来替换描述初始抽象模型类型的现有ModelMetadata属性,从而有效地使模型绑定器忘记它始终绑定到非具体类型。
这里的问题是,我不知道从哪里开始。我需要的是让DefaultModelBinder将属性类型视为真实,而不是声明的类型 - 它是否可能?