【问题标题】:Validation of child object子对象的验证
【发布时间】:2012-10-18 13:00:44
【问题描述】:

我有一个包含子对象的对象。例如。

public class Person
{
    public string Name { get; set; }
    public Car Car { get; set; }
 }

 public class Car
 {
     public int CarId{get;set;
     public string Name { get; set; }
     public string Year { get; set; }
 }

然后在我的 Razor 视图中,我使用 DropDownlistFor,其中包含用户可以选择的汽车列表。我像

一样绑定下拉列表
    @Html.LocalLabelFor(m => m.Person.Car)
    @Html.DropDownListFor(m => m.Person.Car, new SelectList(Model.Cars, "CarID, "Name"), "Select")

当用户没有选择汽车时,jquery 验证仍然会验证 CarId 未被选择。汽车对象必须可以为空。

我知道我可以通过创建平面视图模型来解决这个问题。

还有其他方法可以让汽车在表格中成为可选的吗?

【问题讨论】:

  • 在这篇文章可以提供另一个答案之前,我创建了视图模型。如果有替代方案会很酷。

标签: asp.net-mvc-3 validation jquery-validate


【解决方案1】:

只需让 CarId 可以为空:

public class Car
 {
     public int? CarId { get; set };
     public string Name { get; set; }
     public string Year { get; set; }
 }

【讨论】:

  • 这更像是一种破解而不是解决方案,我确实考虑过,但这意味着在我的“汽车”编辑视图中,CarId 可以设置为空。这只是一个简单的例子,在应用程序中,我有很多这样的对象,并且将Id设置为可空的感觉不对。
  • @Captain0 我不明白,您不希望 CarId 可以为空,而那时您想在视图侧将其留空。如果留空,则必须插入空值,为此,变量必须可以为空。
【解决方案2】:

在控制器动作中从模型状态中清除错误

例如

[HttpPost]
public ActionResult Save(Person person)
{
      if (person.Car != null && person.Car.CarId == 0)
      {
        if (ModelState.ContainsKey("Car.CarId"))
          ModelState["Car.CarId"].Errors.Clear();
      }

      return View();
}

【讨论】:

  • 验证发生在客户端,在提交之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多