我如何验证特定的字段/属性的特定模型实例在asp.net MVC

本文关键字:实例 模型 属性 asp MVC net 字段 验证 何验证 | 更新日期: 2023-09-27 17:52:33

我有一个模型类,有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无效等。在控制器中,我只发布了Prop2Session模型。我不能使用ModelState和它的方法,例如ModelState.IsValidField(),因为它将是发布模型的验证信息。我也不能使用controller.TryValidateModel(originalModel),因为我只是得到false,我不会得到关于为什么它是false的信息,所以如果Prop1无效,我将无法重定向到View1,如果Prop3无效,我将无法重定向到View3那么我怎么能验证只有Prop1的原件模型?

我如何验证特定的字段/属性的特定模型实例在asp.net MVC

使用视图模型:

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