如何在ASP .NET MVC中验证特定模型实例的特定字段/属性?

时间:2013-01-13 12:45:03

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

我有一个包含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的模型和模型。我不能使用ModelStateModelState.IsValidField()之类的方法,因为它将是已发布模型的验证信息。此外,我无法使用controller.TryValidateModel(originalModel),因为我刚收到false而且我没有得到有关false原因的信息,因此我将无法重定向到View1如果Prop1无效,则View3如果Prop3无效。 那么如何只验证originalModel的Prop1?

1 个答案:

答案 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");
}