asp.NET MVC 2 DataAnnotations UpdateModel <T>проверка - PullRequest
5 голосов
/ 08 февраля 2010

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

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

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

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

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

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

1 голос
/ 08 февраля 2010

Новый ответ:

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

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

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

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

0 голосов
/ 08 февраля 2010

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

Типичный шаблон обновления:

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

Если вы ожидаете автоматического вызова функции IsValid для вашей модели, этого не произойдет. Аннотации данных работают за кулисами со словарем ModelState в базовом классе Controller.

...