Я пытаюсь использовать DataAnnotations для добавления проверки в мои модели в asp.NET MVC 2 RC2, используя TryUpdateModel
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
Это обновляет модель, но проверка никогда не вызывается. Я также попытался использовать TryUpdateModel (который является прямым типом пользователя), не используя провайдера значения формы, напрямую используя ProvisioningObject (который имеет метаданные проверки).
Поиск в Google только для примеров позволяет мне использовать DataAnnotations путем привязки через параметр
public ActionResult Update(User user)
Что мне не нравится в сценариях обновления.
Какие-либо советы и / или решения?
EDIT
Мои объекты являются автоматически сгенерированными объектами из службы WCF.
Я сделал партиалы, чтобы иметь возможность добавлять аннотации данных.
Я трижды вызываю TryUpdateModel, потому что он явно не поддерживает наследование, что, по-моему, также является моей проблемой с DataAnnotations. Я указываю атрибуты проверки для ProvisioningObject, и привязка не ищет унаследованные подобные вещи.
[MetadataType(typeof(ProvisioningObjectMetadata))]
public partial class ProvisioningObject : IProvisioningObject
{
public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } }
}
[MetadataType(typeof(UserMetadata))]
public partial class User : IUser
{
}
public class ProvisioningObjectMetadata
{
[DisplayName("Country")]
public string CountryIsoCode { get; set; }
[Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")]
[TempValidator]
public string DisplayName { get; set; }
}
public class UserMetadata
{
[DisplayName("Username")]
public string Name { get; set; }
}
// Controller action
public ActionResult Update(string id, FormCollection form)
{
var user = UserManager.Find(id);
this.TryUpdateModel<IUser>(user.User, form.ToValueProvider());
this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider());
this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider());
if (ModelState.IsValid) // always true
{
return Redirect;
}
else
{
return View();
}
}
Если я добавлю метаданные для DisplayName в UserMetadata, он будет работать, как и ожидалось, но это кажется очень бесполезным. И это будет означать, что мне также придется копировать / вставлять все мои унаследованные интерфейсы, чтобы TryUpdateModel вел себя соответствующим образом.
Полагаю, я ищу способ, который не требует от меня копирования и вставки атрибутов проверки в унаследованные классы.