希望我错过了一些明显的东西,但是我写了一些代码时遇到了一些问题,而且感觉我没有正确编写代码。
所以,假设我有以下模型:
public class SampleViewModel {
[Required]
public string Property1 { get; set; }
[Required]
[EmailAddress]
public string Property2 { get; set; }
public IList<AbstractModel> Items { get; set; }
}
然后我有这个抽象的视图模型:
public abstract AbstractModel {
[Required(ErrorMessage = "This field is required")]
public virtual string Value { get; set; }
}
这些具体的视图模型:
public ConcreteModel1 : AbstractModel { }
public ConcreteModel2 : AbstractModel { }
在我的控制器中,我有以下代码(这实际上是在其他地方完成的,但是对于这个样本,这很好):
var model = new SampleViewModel();
var fields = new List<AbstractModel>() {
new ConcreteModel1() { Value = model.Property1 },
new ConcreteModel2() { Value = model.Property2 },
};
model.Fields = fields;
return View(model);
在SampleViewModel局部视图中(因为每个视图模型类型都有一个),我有以下内容:
@model SampleViewModel
@for(var i = 0; i < Model.Items; i++) {
@Html.EditorFor(m => Model.Items[i])
}
让我们说每个AbstractModel我也有一个独特的局部视图(具有非常不同的布局要求)。
ConcreteModel1的示例:
@model ConcreteModel1
@Html.TextboxFor(m => m.Value)
而对于ConcreteModel2:
@model ConcreteModel2
@Html.DisplayFor(m => m.Value)
这一切都正常,但由于我必须将ViewModel的属性(Property1)传递给AbstractModel,我已经失去了视图和底层模型之间的连接。我已经能够使用自定义Model Binder将表单字段绑定回模型,但我遗漏的主要内容是已添加到SampleViewModel类的模型验证器。
理想情况下,我希望此信息可供AbstractModel使用。验证正在进行,但我只是在客户端上获得基本验证(通过AbstractModel的Value required属性),但我希望能够将我的SampleViewModel的验证需求传递到AbstractModel中。
我真正想要的是,AbstractModel的Value属性以某种方式模拟传递给它的属性,因此它只是作为原始模型的代理,但刚刚重新塑造了SampleViewModel(或者特别是它的Property1属性)。
所以重要的是,考虑到以下我的领域的创建:
var fields = new List<AbstractModel>() {
new ConcreteModel1() { Value = model.Property1 },
new ConcreteModel2() { Value = model.Property2 },
};
AbstractModels如何知道它们的值应该是:必需的,还有必需的和EmailAddress,基于用于创建它们的属性?
感谢您的投入。