Было бы довольно легко написать собственный атрибут проверки:
public class RequiredIfPropertyIsEmptyAttribute : RequiredAttribute
{
private readonly string _otherProperty;
public RequiredIfPropertyIsEmptyAttribute(string otherProperty)
{
_otherProperty = otherProperty;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var property = validationContext.ObjectType.GetProperty(_otherProperty);
if (property == null)
{
return new ValidationResult(string.Format("Unknown property {0}", _otherProperty));
}
var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null);
if (otherPropertyValue == null)
{
return base.IsValid(value, validationContext);
}
return null;
}
}
, тогда вы могли бы иметь модель представления:
public class MyViewModel
{
public string Foo { get; set; }
[RequiredIfPropertyIsEmpty("Foo")]
public string SelectedItemId { get; set; }
public IEnumerable<SelectListItem> Items {
get
{
return new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
};
}
}
}
Контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
И, конечно, представление:
@model MyViewModel
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(x => x.Foo)
@Html.EditorFor(x => x.Foo)
</div>
<div>
@Html.LabelFor(x => x.SelectedItemId)
@Html.DropDownListFor(x => x.SelectedItemId, Model.Items, "-- select an item --")
@Html.ValidationMessageFor(x => x.SelectedItemId)
</div>
<input type="submit" value="OK" />
}
или вы можете сделать, как я: скачать и использовать библиотеку FluentValidation.NET , забыть о аннотациях данных и написать следующую проверкулогика, которая кажется довольно очевидной:
public class MyViewModelValidator: AbstractValidator<MyViewModel>
{
public MyViewModelValidator()
{
RuleFor(x => x.SelectedItemId)
.NotEmpty()
.When(x => !string.IsNullOrEmpty(x.Foo));
}
}
Просто иди и Install-Package FluentValidation.MVC3
и сделай свою жизнь проще.