0

私は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 Postアクションメソッド:

[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);
}

何も選択されていないときに必要なメッセージを表示するにはどうすればよいですか?

4

1 に答える 1

0

int問題は、 for のComponentId代わりに nullableを使用していることだと思いますint。をnullにすることはできない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 は有効な値ではなくなります。

于 2013-02-20T14:32:13.700 に答える