Я пытаюсь использовать DataAnnotations добавить проверку моих моделей в ASP.NET MVC 2 RC2, используя TryUpdateModelasp.NET MVC 2 DataAnnotations UpdateModel <T> проверка
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
Это обновляет модель, но проверка никогда не называется. Я также попытался использовать TryUpdateModel (который является прямым типом пользователя), не используя поставщика значений формы, напрямую используя ProvisioningObject (который имеет метаданные проверки), безрезультатно.
погуглить примеры только дает мне способы использования DataAnnotations путем связывания с помощью параметра
public ActionResult Update(User user)
Что мне не нравится в сценариях обновления.
Любые советы и/или решения?
EDIT Мои объекты являются объектами с автоматической сгенерировкой из службы WCF.
Я сделал частичные для добавления DataAnnotations. Я трижды вызываю 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 ведет себя соответствующим образом.
Я предполагаю, что я ищу способ, который не требует от меня копирования и вставки моих атрибутов проверки наследуемых классов.
Я просто попытался сделать UpdateModel (так как я не могу поставить MetadataType на интерфейсе), и это ничего не меняет. Я создал временный валидатор, и он, кажется, никогда не ударил по методу IsValid. Для сценария обновления я не уверен, что следую за вами. Если у вас хорошие ссылки на блоги или примеры, этого было бы достаточно, чтобы начать меня. Спасибо за ввод! –
Можете ли вы разместить больше кода, пожалуйста? Я не понимаю, к чему вы пытаетесь больше. – jfar
Новый комментарий к ответу: атрибуты являются клиентскими. Я использую частичные классы для добавления соответствующих атрибутов к автоматически сгенерированным объектам. –