2010-02-08 5 views
5

Я пытаюсь использовать 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 ведет себя соответствующим образом.

Я предполагаю, что я ищу способ, который не требует от меня копирования и вставки моих атрибутов проверки наследуемых классов.

ответ

1

Новый Ответ:

«Мои объекты автоматически генерируемые объекты из службы WCF.»

Автогенерируемые объекты не будут иметь никаких атрибутов. Вы определяете свои объекты и их атрибуты на стороне сервера или на стороне клиента?

Old Answer: Если ваши метаданные не находятся на IProvisioningObject, то не будет вызываться валидация. Подлинная модель MVC2 по умолчанию не знает, как найти дополнительную информацию о [extra] [MetadataType (buddyClass)].

Сценарии обновления привязываются к DTO, а затем сопоставляют DTO, если IsValid() - к вашим основным классам моделей.

+0

Я просто попытался сделать UpdateModel (так как я не могу поставить MetadataType на интерфейсе), и это ничего не меняет. Я создал временный валидатор, и он, кажется, никогда не ударил по методу IsValid. Для сценария обновления я не уверен, что следую за вами. Если у вас хорошие ссылки на блоги или примеры, этого было бы достаточно, чтобы начать меня. Спасибо за ввод! –

+0

Можете ли вы разместить больше кода, пожалуйста? Я не понимаю, к чему вы пытаетесь больше. – jfar

+0

Новый комментарий к ответу: атрибуты являются клиентскими. Я использую частичные классы для добавления соответствующих атрибутов к автоматически сгенерированным объектам. –

0

Откуда вы знаете, что валидация не называется? Вы проверяете ModelState.IsValid в своем контроллере обновлений и обнаруживаете, что он ошибочно вернется?

Типичная картина обновления:

UpdateModel(model); 
if(!ModelState.IsValid) return View(model); 
return RedirectToAction("Index"); 

Если вы ждете какой-то «IsValid» на вашей модели, чтобы автоматически назвать, что не будет. Аннотации данных работают за кулисами с помощью словаря ModelState в базовом классе контроллера.

+0

ModelState.IsValid всегда верен, даже если я помещаю специальный атрибут проверки, который всегда возвращает false. Точка останова в этом атрибуте проверки никогда не попадает. Он работает, если я правильно поставил правильность по типу, а не по интерфейсу. Я собираюсь вставить больше кода за секунду. –

+0

Вы пытались помещать атрибут типа метаданных в объявление класса? Пример: интерфейс IDataObject {... содержит DataAnnotations ...} [MetadataType (TypeOf (IDataObject))] класс DataObject {....} – kmehta

+0

Мехта Такая же проблема. Он работает, если я поместил DataAnnotations прямо на интерфейс, но я не хочу дублировать проверку с родительского класса/интерфейса. –

1

Реализовать IDataErrorInfo интерфейс в вашем разделяемом классе Вам придется написать пользовательскую проверку для каждого поля (где вы можете использовать класс аннотаций данных для проверки каждого требуемого свойства)

Если вам нужен пример кода, то дайте мне знать. Я напишу вам это!

источник: http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx

Смежные вопросы