gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:47:44 25 4
gpt4 key购买 nike

我有一个大模型(大我的意思是模型类包含很多字段/属性,每个字段/属性至少有一个验证属性(例如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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com