If you're on MVC3/.NET4, you can use IValidatableObject
which exists specifically for such purposes.
Quoting ScottGu,
...The IValidatableObject interface enables you to perform model-level
validation, and enables you to provide validation error messages
specific to the state of the overall model....
You model would look like
public class MyViewModel : IValidatableObject
{
public long? Id { get; set; }
public decimal? ProposedCost { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Id != null && ProposedCost == 0) {
yield return new ValidationResult("ProposedCost must be provided.");
}
}
}
and then in the controller,
[HttpPost]
public ActionResult Submit(MyViewModel model)
{
if (!ModelState.IsValid) {
//failed - report an error, redirect to action etc
}
//succeeded - save to database etc
}
Otherwise, the most clean solution would be to use view models - UpdateViewModel
where the property is required, and CreateViewModel
where it's not required.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…