Как выполнить проверку модели ASP.NET MVC с помощью DataAnnotations, где ViewModel содержит объекты из внешней веб-службы? - PullRequest
2 голосов
/ 17 августа 2010

Я хотел бы использовать DataAnnotations для базовой клиентской и серверной проверки моих MVC ViewModels. Моя ViewModel выглядит так:

public class MyViewModel
{
    public Client Client1 { get; set; }
    public Client Client2 { get; set; }
    public Product Product { get; set; }
}

Итак, я хотел бы проверить, что у обоих клиентских объектов есть имя и номер телефона, у объекта продукта есть действительная числовая цена и т. Д.

У меня проблема в том, что Client и Product являются типами прокси, сгенерированными Visual Studio из веб-службы, поэтому я не могу напрямую добавить атрибуты аннотации к их обязательным свойствам.

Я читал о , используя атрибут MetadataType , чтобы указать метаданные в альтернативном классе (с дублирующимися свойствами), но в этом случае я даже не могу добавить этот атрибут в Client и Product классы.

Или я могу? В папке «Веб-ссылки», в которой сохранено мое решение VS, есть папка для пространства имен веб-службы, содержащая файл с именем Reference.cs, в котором содержится сгенерированный VS код для типов прокси.

Если я добавлю метаданные к классам здесь, будет ли это работать - или это действительно плохая идея? Или есть просто более простой и понятный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 18 августа 2010

После небольшой охоты я обнаружил, что это на самом деле удивительно просто - это был просто случай, когда я не знал точно, что искать!

На самом деле вам не нужно добавлять MetadataTypeатрибут определения класса original : вы можете добавить его к пустому частичному классу того же типа (убедитесь, что ваш частичный класс находится в том же пространстве имен, что и исходный тип).

Затем вы просто создаете класс «собеседника», содержащий ваши правила проверки, как обычно:

using System.ComponentModel.DataAnnotations;

namespace WebServiceNamespace
{
    [MetadataType(typeof(ClientMetaData))]
    public partial class Client
    {
    }

    public class ClientMetaData
    {
        [Required(ErrorMessage = "Please enter a name")]
        public string Name { get; set; }

        [Required(ErrorMessage="Please enter a telephone Number")]
        public string Telephone { get; set; }
    }
}

Это прекрасно работает со стандартной привязкой модели и не требует доступа к исходному коду длятипа, так что вы можете легко установить правила проверки с помощью DataAnnotations, даже для типов, которые не являются частью вашей базы кода.

0 голосов
/ 17 августа 2010

Я думаю, что было бы лучше создать модель и затем отобразить поля с помощью AutoMapper и / или Model Generator Helper (http://modelhelper.codeplex.com/).

0 голосов
/ 17 августа 2010

Изменение сгенерированного кода будет работать до тех пор, пока вы не восстановите его и не запишите свои изменения.Кроме возможности потерять вашу работу, если кто-то сгенерирует ссылку, нет причины, по которой вы не можете добавить ссылки метаданных в прокси-классы.

Другой альтернативой является использование пользовательской проверки или созданиемодель, которую вы затем сопоставите поля с прокси-объектами.Создание модели, не основанной на объекте Client, будет вашим самым безопасным методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...