【问题标题】:How to validate multiple, separate models in a single ViewModel using ASP.NET MVC?如何使用 ASP.NET MVC 在单个 ViewModel 中验证多个单独的模型?
【发布时间】:2016-07-05 18:21:42
【问题描述】:

所以我有两个独立的模型:ModelAModelB。我还有一个 ViewModel:TheViewModelTheViewModel 包含 ModelAModelB 的实例。

ModelAModelB 有各自的属性和 [Required]。但是,当我发布表单时,TheViewModel 仅验证 ModelA 而忽略 ModelB

如何使用一个 ViewModel 验证多个模型?

一些代码sn-ps:

模型A

public class ModelA
{
    [Required]
    public string TheID { get; set; }
    public string TheName { get; set; }
}

模型B

public class ModelB
{
    [Required]
    public string TheCode { get; set; }
    public string TheType { get; set; }
}

视图模型

public class TheViewModel
{
    public ModelA ModelAExample { get; set; }
    public ModelB ModelBExample { get; set; }
}

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(TheViewModel vm)
{
   if (ModelState.IsValid)
   {
      return RedirectToAction("Index", "Home");
   }

   return View(vm.ModelAExample, vm.ModelBExample));
}

ModelState 只会验证ModelA 中的TheID 属性是否有效,而不是ModelB 中的TheCode 是否有效

【问题讨论】:

  • 您还应该在 TheViewModel 类的两个属性中包含 [Required]。当你说 ModelState.IsValid 在不应该返回 true 时,TheCode 的值是多少?最后,您应该将变量 vm 传递给 View 方法,因为 View 需要 1 个模型而不是多个模型。

标签: c# asp.net asp.net-mvc validation asp.net-mvc-4


【解决方案1】:

您只需要传递 vm 即可查看。模型绑定只发生在一个模型上。如果你想在这种情况下传递多个模型,你必须使用动态对象,如 ViewBag 等.....

 return View(vm);

然后您可以将 View Model 与您的 View 绑定。您提供的代码将不会运行 return View(vm.ModelAExample, vm.ModelBExample)); 这里会抛出语法错误

Best Practices ViewModel Validation in ASP.NET MVC

【讨论】:

    【解决方案2】:

    这不会编译:

    return View(vm.ModelAExample, vm.ModelBExample));
    

    如果你使用vm作为ViewModel,验证是正确的:

    return View(vm)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2020-08-16
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多