如何使用FluentValidation获取单选按钮所需的错误消息

时间:2013-02-20 12:55:29

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 fluentvalidation

我正在使用ASP.NET MVC 4和最新的FluentValidation

我正在努力让我的单选按钮进行验证。当我单击提交按钮时,我需要在单选按钮列表中进行选择。

在我看来,我有以下内容:

@model MyProject.ViewModels.Servers.ServicesViewModel
@Html.ValidationMessageFor(x => x.ComponentTypeId)
@foreach (var componentType in Model.ComponentTypes)
{
     <div>
          @Html.RadioButtonFor(x => x.ComponentTypeId, componentType.Id, new { id = "emp" + componentType.Id })
          @Html.Label("emp" + componentType.Id, componentType.Name)
     </div>
}

我的ComponentType类:

public class ComponentType : IEntity
{
     public int Id { get; set; }

     public string Name { get; set; }
}

我设置视图模型属性的操作方法的一部分:

ServicesViewModel viewModel = new ServicesViewModel
{
     ComponentTypes = componentTypeRepository.FindAll(),
     Domains = domainRepository.FindAll()
};

我的观点模型:

[Validator(typeof(ServicesViewModelValidator))]
public class ServicesViewModel
{
     public int ComponentTypeId { get; set; }

     public IEnumerable<ComponentType> ComponentTypes { get; set; }

     public int DomainId { get; set; }

     public IEnumerable<Domain> Domains { get; set; }
}

我的验证员类:

public class ServicesViewModelValidator : AbstractValidator<ServicesViewModel>
{
     public ServicesViewModelValidator()
     {
          RuleFor(x => x.ComponentTypeId)
               .NotNull()
               .WithMessage("Required");

          RuleFor(x => x.DomainId)
               .NotNull()
               .WithMessage("Required");
     }
}

我的http发布操作方法:

[HttpPost]
public ActionResult Services(ServicesViewModel viewModel)
{
     Check.Argument.IsNotNull(viewModel, "viewModel");

     if (!ModelState.IsValid)
     {
          viewModel.ComponentTypes = componentTypeRepository.FindAll();
          viewModel.Domains = domainRepository.FindAll();

          return View(viewModel);
     }

     return View(viewModel);
}

如果没有选择任何内容,如何让它显示我所需的消息?

1 个答案:

答案 0 :(得分:0)

我认为问题在于您使用int代替ComponentId代替可空int。您正在使用永远不会触发的NotNull()验证程序,因为int不能为空。

尝试将其切换为:

[Validator(typeof(ServicesViewModelValidator))]
public class ServicesViewModel
{
     public int? ComponentTypeId { get; set; }

     public IEnumerable<ComponentType> ComponentTypes { get; set; }

     public int DomainId { get; set; }

     public IEnumerable<Domain> Domains { get; set; }
}

如果该剂量不起作用,那么您可以尝试使用范围验证:

public class ServicesViewModelValidator : AbstractValidator<ServicesViewModel>
{
     public ServicesViewModelValidator()
     {
          RuleFor(x => x.ComponentTypeId)
               .InclusiveBetween(1, int.MaxValue)
               .WithMessage("Required");

          RuleFor(x => x.DomainId)
               .NotNull()
               .WithMessage("Required");
     }
}

这样可以使0不是有效值。