MVC抽象ViewModel,保留验证属性(动态)

时间:2017-02-06 15:22:08

标签: c# asp.net-mvc model attributes abstract

希望我错过了一些明显的东西,但是我写了一些代码时遇到了一些问题,而且感觉我没有正确编写代码。

所以,假设我有以下模型:

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,基于用于创建它们的属性?

感谢您的投入。

0 个答案:

没有答案