在viewmodel中验证模型?

时间:2010-08-27 10:42:59

标签: asp.net-mvc asp.net-mvc-2

我想知道是否有办法在viewmodel中验证我的一个模型将其发送给我的操作?我使用DataAnnotations作为验证规则。

if (!ModelState.IsValid)

类似

如果问题不清楚,请告诉我,我会编辑以便更好地进行探索

修改 我的viewmodel看起来像这个

public class CompaniesViewModel
{
    public Core.Model.Customer Company { get; set; }        
    public IEnumerable<SelectListItem> Items { get; set; }        
    public Core.Model.Meeting Meeting { get; set; }
}

在这种特殊情况下,我想要做的只是验证客户。我不能做ModelState.IsValid然后所有得到验证。那么在这种情况下,如何才能像客户一样验证其中一个。希望这更清楚

3 个答案:

答案 0 :(得分:1)

有许多不同的方法可以做到这一点。第一种是添加一个名为IsValid的属性来检查属性。如下所示:

public class Company
{
  public bool IsValid
  {
    get { return GetValid() }
  }

  private bool IsValid()
  {
    if ( Some check here )
      return false;
  }
}


[HttpPost]
public ActionResult SomeAction(CompaniesViewModel model)
{
  if (model.Company.IsValid)
  {
  }
}

然而,更好的解决方案IMO只是将公司发布到您的控制器而不是整个视图模型。仅仅因为您将视图模型传递给视图并不意味着您需要将整个视图模型发回。创建HTML表单时,仅指定要发布回控制器的属性。例如,您的控制器将成为:

[HttpPost]
public ActionResult SomeAction(Company company)
{
  if (Model.IsValid)
  {
  }
}

现在,当你检查Model.IsValid是否只检查公司时,你已经将所有内容传回控制器。

答案 1 :(得分:0)

您可以将客户模型与ViewModel中的其他类分开,并将其映射到现有/新客户

public class CompaniesViewModel
{
    public Company Company { get; set; }        
    public IEnumerable<SelectListItem> Items { get; set; }        
    public Core.Model.Meeting Meeting { get; set; }
}

//Validations for Company go here:
public class Company
{
    public string CompanyId { get; set; }

    [Required]
    public string CompanyName { get; set; }
}

答案 2 :(得分:0)

在服务器端,您可以尝试ValidateModel(object)方法,就像在TryValidateModel(CompaniesViewModel.Company)中一样。

如果您启用了客户端验证,则只需发布相关实体。如果要发布所有实体,但只需要验证一个实体,则可以考虑以下内容:

  1. 使用javascript ASP .NET MVC Disable Client Side Validation at Per-Field Level
  2. 删除规则
  3. 或创建数据传输对象,即没有链接到模型的视图模型,但使用您希望在此方案中应用的验证规则再现所需的实体。当然,然后,您需要在控制器或模型绑定器中以某种方式将ViewModel绑定到模型实体。