I don't think so, since the validation is done with the following code in DefaultModelBinder
protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) {
Dictionary<string, bool> startedValid = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(bindingContext.ModelMetadata, controllerContext).Validate(null)) {
string subPropertyName = CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName);
if (!startedValid.ContainsKey(subPropertyName)) {
startedValid[subPropertyName] = bindingContext.ModelState.IsValidField(subPropertyName);
}
if (startedValid[subPropertyName]) {
bindingContext.ModelState.AddModelError(subPropertyName, validationResult.Message);
}
}
You could try tricking the model binder by using a hidden form field for the Person.Address property like this
<%= Html.HiddenFor(m => m.Address) %>
or
<%= Html.HiddenFor(m => m.Address.FirstLine) %> //just pick any property
And that may kick off the model binder to do a validation. Although if this does work, then you will not beable to put in a value, since it is a hidden form field, but I believe this is what you want :)
Alternatively you could try and write your own model binder, but from my experience if you start to go against the grain of the MVC framework it will come back to bite you