我有一个包含4个属性的模型类:
public class ModelClass
{
[Required]
public string Prop1 { get; set; }
[MaxLength(5)]
public string Prop2 { get; set; }
[MinLength(5)]
public string Prop3 { get; set; }
[MinLength(5)]
public string Prop4 { get; set; }
}
查看,我只输入prop2:
@model ModelClass
@Html.TextBoxFor(m => m.Prop2)
还有一些控制器:
[HttpPost]
public ActionResult Index(ModelClass postedModel)
{
var originalModel = Session["model"] as ModelClass;
return View();
}
事情是:整个模型存储在Session
中,因为它填充在分离的视图中。我需要的是仅验证模型的Prop1
,该Session
存储在View1
中。如果验证失败,我需要重定向到其他Prop1
,如果View3
是无效的,或Prop3
如果Prop2
无效等等。在控制器中我发布的模型只有{{1}来自Session
的模型和模型。我不能使用ModelState
和ModelState.IsValidField()
之类的方法,因为它将是已发布模型的验证信息。此外,我无法使用controller.TryValidateModel(originalModel)
,因为我刚收到false
而且我没有得到有关false
原因的信息,因此我将无法重定向到View1
如果Prop1
无效,则View3
如果Prop3
无效。 那么如何只验证originalModel的Prop1?
答案 0 :(得分:1)
使用视图模型:
public class Step1ViewModel
{
[Required]
public string Prop1 { get; set; }
}
然后将您的视图强烈输入视图模型:
@model Step1ViewModel
@Html.TextBoxFor(m => m.Prop1)
最后让您的HttpPost控制器操作将视图模型作为操作参数,以便您只能在当前向导步骤的上下文中成功验证它:
[HttpPost]
public ActionResult Index(Step1ViewModel postedModel)
{
if (!ModelState.IsValid)
{
// validation for this step failed => redisplay the view so that the
// user can fix his errors
return View(postedModel);
}
// validation passed => fetch the model from the session and update the corresponding
// property
var originalModel = Session["model"] as ModelClass;
originalModel.Prop1 = postedModel.Prop1;
return RedirectToAction("Step2");
}