СУХОЙ Валидация с MVC2 - PullRequest
       5

СУХОЙ Валидация с MVC2

1 голос
/ 19 апреля 2010

Я пытаюсь выяснить, как определить правила проверки для моих доменных объектов в одном месте в моем приложении, но наткнулся на препятствие ...

Некоторые предыстории: мое приложение состоит из нескольких частей: - База данных - DAL - Уровень бизнес-логики - SOAP API Layer - Сайт MVC

Веб-сайт MVC обращается к базе данных через SOAP API, как это делают третьи стороны. Мы используем проверку на стороне сервера и на стороне клиента на веб-сайте MVC, а также на уровне API SOAP.

Чтобы избежать необходимости вручную писать проверку на стороне клиента, мы реализуем строго типизированные представления вместе с помощниками Html.TextBoxFor и Html.ValidationMessageFor HTML, как показано на шаге 3 здесь . Мы также создаем пользовательские модели для каждой формы, где одна форма принимает данные для нескольких доменных объектов.

Именно здесь начинается проблема, HTML-помощники читают из модели атрибуты проверки аннотации данных. В большинстве случаев наши формы работают с несколькими объектами домена, и вы не можете указать более одного типа на странице <% @ Page ... Inherits = "System.Web.Mvc.ViewPage <MvcApplication.Models.SomeModel>"%> директивы. Поэтому мы вынуждены создать собственный класс модели, что будет означать дублирование атрибутов проверки из объектов домена в классе модели.

Я потратил довольно много времени на поиски обходных путей, например, ссылаясь на один и тот же MetadataType из класса домена и пользовательских моделей MVC, но это не сработает по нескольким причинам:

  1. Вы можете указать только один атрибут MetadataType для каждого класса, поэтому возникает проблема, если модель ссылается на несколько объектов домена, каждый из которых имеет собственный тип метаданных.

  2. Код проверки аннотации данных выдает исключение, если класс модели не содержит свойства, указанного в указанном MetadataType, который является проблемой с моделью, имеет дело только с подмножеством свойств для данного домена. объект.

Я смотрел и на другие решения, но безрезультатно. Если у кого-то есть какие-либо идеи о том, как создать единый источник логики проверки, который бы работал на клиентских и серверных функциях проверки MVC и других местах (таких как мой SOAP API), я бы хотел это услышать!

Заранее спасибо,

Мэтью

Ответы [ 2 ]

0 голосов
/ 22 апреля 2010

Что вам нужно сделать, это вместо того, чтобы пытаться копировать структуру в моделях представления, используйте ваши существующие модели в классах моделей данных. Когда вы привязываете данные формы обратно к модели представления, вы можете ограничить привязку столбцов, используя атрибут [Bind] в параметре. Или используйте любые другие подходы для этого.

Итак, если ваша модель создает классы, такие как Product User и Category, и ваша модель представления должна использовать некоторые из их свойств, создайте модель представления следующим образом:

public class PageViewModel
{
    public Product Product { get; set; }
    public Category Category { get; set; }
    public User User { get; set; }
}

На вашей странице вы сможете использовать их с

<%: Html.EditorFor(m => m.Product.ProductName) %>

В этом случае при необходимости будут использоваться атрибуты проверки из ваших реальных классов.
Это дает вам приемлемое решение?

0 голосов
/ 19 апреля 2010

Как насчет возврата класса контейнера с вложенными типами в вашем методе действия?

http://weblogs.asp.net/blogs/rajbk/image_63B7D5D4.png

...