c# - 如何只验证 ASP .NET MVC 中模型的一部分?

标签 c# asp.net-mvc model-view-controller model

我有一个大模型(大我的意思是模型类包含很多字段/属性,每个字段/属性至少有一个验证属性(例如RequiredMaxLengthMinLength 等))。我不想创建一个带有大量输入的 View 供用户用数据填充模型,而是想创建多个 View ,用户将在其中填充部分模型字段并转到下一步(某种“向导”).在步骤之间重定向时,我将未填充的模型对象存储在 Session 中。如下所示:

型号:

public class ModelClass
{
    [MaxLength(100)] ...
    public string Prop1{get;set;}
    [MaxLength(100)] ...
    public string Prop2{get;set;}
    ...
    [Required][MaxLength(100)] ...
    public string Prop20{get;set;}
}

Controller :

[HttpPost]
public ActionResult Step1(ModelClass postedModel)
{    
    // user posts only for example Prop1 and Prop2
    // so while submit I have completly emty model object
    // but with filled Prop1 and Prop2
    // I pass those two values to Session["model"]
    var originalModel = Session["model"] as ModelClass ?? new ModelClass();
    originalModel.Prop1 = postedModel.Prop1;
    originalModel.Prop2 = postedModel.Prop2;
    Session["model"] = originalModel;

    // and return next step view
    return View("Step2");
}

[HttpPost]
public ActionResult Step2(ModelClass postedModel)
{
    // Analogically the same
    // I have posted only Prop3 and Prop4

    var originalModel = Session["model"] as ModelClass;
    if (originalModel!=null)
    {
        originalModel.Prop3 = postedModel.Prop3;
        originalModel.Prop4 = postedModel.Prop4;
        Session["model"] = originalModel;

        // return next step view
        return View("Step3");
    }
    return View("SomeErrorViewIfSessionBrokesSomeHow")
}

Step1 View 仅包含 Prop1Prop2 的输入,Step2 View 包含 Prop3 的输入>Prop4

但事情就是这样

当用户打开时,例如,第 1 步,并使用超过 100 个字符长度的值填充 Prop1,客户端验证工作正常。但是,当然,我必须在 Controller 的服务器端验证这个值。如果我有完整模型,我会执行以下操作:

if(!ModelState.IsValid) return View("the same view with the same model object");

因此用户必须重新填写表格并更正。 但是 在第 1 步用户只填写了 20 个属性中的 2 个,我需要验证它们。我不能使用 ModelState.IsValid,因为模型状态将无效。如您所见,Prop20 标记有 [Required] 属性,当用户提交 Prop1Prop2 时,Prop20 为空,这就是 ModelState 无效的原因。当然,我可以允许用户转到第 2 步,填写所有步骤并仅在最后一步验证模型状态,但我不想让用户在第 1 步填写不正确时转到第 2 步。我想在 Controller 中进行此验证。 所以问题是: 如何只验证模型的一部分?如何验证只有部分模型属性与其验证属性匹配?

最佳答案

一种可能的解决方案:

  1. 使用 ModelState.IsValidField(string key);

    if (ModelState.IsValidField("Name") && ModelState.IsValidField("Address"))
    { ... }
    

最后当一切都完成后使用:

if(ModelState.IsValid) { .. }

关于c# - 如何只验证 ASP .NET MVC 中模型的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14280714/

相关文章:

c# - 滚动到虚拟化 ItemsControl 的元素

javascript - MVC 将列表传递给 jQuery 并提取元素

java - SpringMVC使用注解和xml配置

c# - 如何确定剪贴板内容的编码

c# - 是否可以返回到C#中遇到错误的行?

c# - MVC 和 JQuery : Best practice for retrieving form data

ruby-on-rails - rails : optimizing a controller action (security checking)

c# - MVC/ASP.NET 中的自定义 session 处理

c# - Foreach 在 MVC 4 View 中的 ViewData

laravel - 在 Laravel 的 Blade 模板中显示格式化属性