我有一个大模型(大我的意思是模型类包含很多字段/属性,每个字段/属性至少有一个验证属性(例如Required
、MaxLength
、 MinLength
等))。我不想创建一个带有大量输入的 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 仅包含 Prop1
和 Prop2
的输入,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]
属性,当用户提交 Prop1
和 Prop2
时,Prop20
为空,这就是 ModelState
无效的原因。当然,我可以允许用户转到第 2 步,填写所有步骤并仅在最后一步验证模型状态,但我不想让用户在第 1 步填写不正确时转到第 2 步。我想在 Controller 中进行此验证。 所以问题是:
如何只验证模型的一部分?如何验证只有部分模型属性与其验证属性匹配?
最佳答案
一种可能的解决方案:
使用 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/