我在使用多个ViewModel验证一个视图时遇到问题。我的情况是,我有一个基本形式,对于很多页面都是一样的。通过ID参数,我将新的外部字段呈现给此Basic表单。这些外部字段是ActionResult的类型,使用自己的ViewModel和自己的Controller。在Post操作的主控制器中,我想控制ModelState.IsValid,但我有问题 - 它验证所有外部字段的所有ViewModel,但我想只验证活动外部字段的ViewModel(以及Basic表单)。
看起来像这样:
所有视图模型的ViewModel
public class AllFieldsVm
{
public BasicFormVm BasicFormVm { get; set; }
public ExternalFieldXyVm ExternalFieldXyVm { get; set; }
public AnotherExternalFieldVm AnotherExternalFieldVm { get; set; }
}
在外部字段的控制器中,我创建AllFieldsVm
的新实例,并在此创建ExternalFieldXyVm
的新实例(如果需要,我预填充这些字段)。这个我渲染的whitout布局就像部分视图(使用@{Html.RenderAction("Action", "Controller", new {@someOptionalData = value});}
),当某些条件为真时。
在Post动作的基本形式的控制器中我有这样的东西,我想使用类似这样的代码 if (ModelState.IsValid(model.BasicFormVm) && ModelState.IsValid(model.ExternalFieldXyVm))
:
[POST("someurl-id{someId}")]
public ActionResult SaveFormData(int someId, AllFieldsVm model)
{
//Here I want something like
//if (ModelState.IsValid(model.BasicFormVm) && ModelState.IsValid(model.ExternalFieldXyVm)) or something like that...
var se = new SomeEntity();
se.property1 = model.property1;
se.property2 = model.property2;
using (var dbc = _db.Database.BeginTransaction())
{
try
{
_db.Add(se);
_db.SaveChanges();
//My Condition - when save external data
if (someId == (int) MovementTypes.SomeEnumInt)
{
var rd = new ExternalFieldEntity
{
PropertyA = se.property0,
PropertyB = Convert.ToDateTime(model.ExternalFieldXyVm.SomeExternalFieldName)
};
_db.Add(rd);
_db.SaveChanges();
}
dbc.Commit();
}
catch (Exception)
{
dbc.Rollback();
}
}
return RedirectToAction("Action", "Controller");
}
所以,我的问题是,如何根据某些条件分别验证ExternalFieldXyVm?
是否可以,或者我必须创建所有自己的验证器,而不使用基本的DataAnnotations或FluentValidation?我对这些类型的表格没有经验,所以请耐心等待......
感谢所有人的帮助!!
答案 0 :(得分:1)
太好了,我明白了。我玩了两天,不知道我怎么可能没看到。
结果是:当主视图模型中包含自己的视图模型的视图未呈现到视图中时,此视图模型不会在后期操作上进行验证。所以我的Basic表单每次都是验证,而ExternalFields只在渲染时才会生效。对不起,这个愚蠢的问题......