[Required]
public string A { get; set; }
[Required]
public string B { get; set; }
[Required]
public string C { get; set; }
[Required]
public string D { get; set; }
public static ValidationResult CheckRequired(Test m)
{
if (m.FLG=="1" && m.A == null)
{
return new ValidationResult("エラー");
}
return ValidationResult.Success;
}
1[Serializable]2public class TestModel : IValidatableObject
3{4 public string Flg { get; set;}5 public string A { get; set;}6 public string B { get; set;}7 public string C { get; set;}8[Required]9 public string D { get; set;}1011 public IEnumerable<ValidationResult>Validate(ValidationContext validationContext)12{13if(this.Flg =="1")14{15if(string.IsNullOrEmpty(this.A))16{17 yield return new ValidationResult("Aは入力が必須です。", new string[]{"A"});18}19if(string.IsNullOrEmpty(this.B))20{21 yield return new ValidationResult("Bは入力が必須です。", new string[]{"B"});22}23if(string.IsNullOrEmpty(this.C))24{25 yield return new ValidationResult("Cは入力が必須です。", new string[]{"C"});26}27}28}29}
FLG プロパティも Model 定義に含めてテキストボックスの文字列と一緒に View から POST するようにすれば、検証メソッドの引数に FLG およびテキストボックス A ~ D のユーザー入力すべてがモデルバインドされますので、そこで検証できます。
具体的には以下のような感じです。
Controller と Model
Controller と Model を一緒にしたのは単に分けるのが面倒だったから。CustomValidation 属性は各プロパティではなくクラスに設定。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AdventureWorksLT;
using Mvc5App.Extensions;
using System.ComponentModel.DataAnnotations;
namespace Mvc5App.Controllers
{
[CustomValidation(typeof(SampleModel), "ValidateSampleModel")]
public class SampleModel
{
public bool Flg { get; set; }
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
public string D { get; set; }
public static ValidationResult ValidateSampleModel(SampleModel model)
{
if (model == null)
{
throw new NullReferenceException();
}
if (model.Flg)
{
// 事前に Trim した方がよさそうだが省略
if (String.IsNullOrEmpty(model.A) || String.IsNullOrEmpty(model.B) ||
String.IsNullOrEmpty(model.C) || String.IsNullOrEmpty(model.D))
{
return new ValidationResult("Flg = 1 and one or more of TextBox(es) A, B, C & D empty");
}
}
else
{
if (String.IsNullOrEmpty(model.D))
{
return new ValidationResult("Flg = 0 and TextBox D empty");
}
}
return ValidationResult.Success;
}
}
public class HomeController : Controller
{
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(SampleModel sample)
{
if (!ModelState.IsValid)
{
return View(sample);
}
return RedirectToAction("Index", "Home");
}
}
}