Вопрос

Я использую ASP.NET MVC3 с Enitity FrameWord. Оба общаются через веб -сервис WCF.

Проблема заключается в том, что на серверной стороне разработчиков DB не хотят устанавливать атрибуты [требуется]/[диапазон] в свойство в классах объектов. Но я хочу проверить поле на моем конце в приложении MVC3. где, как я добавил ссылку на веб -сервис WCF. который сгенерировал прокси.

Я не хочу использовать jquery/javascript в соответствии с политикой клиента. Поэтому мне нужно сделать это на уровне контроллера/модели. Как справиться с этим? Некоторое время, как мне нужно добавить необходимый атрибут к свойствам каждого объекта динамически из MVC 3 AAPLICATION. Нужна правильное направление, чтобы ускорить.

Забыл добавить: разработчик DB строго избегает пользователя. Также БД не генерируется в сущности и отображениях.

Это было полезно?

Решение

Вы должны Напишите код, чтобы проверить свои объекты. Анкет Даже если бы разработчики использовали эти атрибуты на сущностях, у вас их не будет на вашей стороне, потому что вы получаете доступ к DAL через прокси -сервер WCF, и эти атрибуты не генерируются инструментом на вашей стороне.

Все классы, сгенерированные с помощью ссылки на добавление услуг, должны быть частичными, поэтому вы можете добавить свою пользовательскую частичную часть и реализовать проверку (реализация IValidatableObject интерфейс).

Другие советы

Я согласен с Ladislav Mrnka, но если вы не можете изменить свойства класса сущности, вы должны его найти:

[MetadataType(typeof(YourOwnClassForValidation))]
public partial class ClassOfYourDbDeveloper
{
    // db developer doesn't allow you to change this
    public string Title { get; set; }
}

public class YourOwnClassForValidation
{
    // here you can use your data annotations
    // important to use object
    [Required]
    public object Title { get; set; }
}

Это просто для установления свойств, подробнее об этом здесь, внизу: http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs

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

Наличие вашей сущности, это нельзя изменить:

public class MyModel 
{
    public int IntProperty { get; set; }

    public DateTime DateProperty { get; set; }
}

Вы можете иметь его метаданные на стороне MVC, которые вы можете проверить и предоставить метаданные, как если бы это был оригинальный класс:

[ValidationAttribute(...)]
[ValidationAttribute(...)]
public class MyModelValidator
{
    [Required]
    [Display("My Integer")]
    public int IntProperty { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime DateProperty { get; set; }
}

Наконец, вам просто нужно прикрепить класс метаданных/валидатора к классу корреспондента, например, на Global.asax:

protected void Application_Start()
{
    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;

    typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
            typeof(MyModel),
            typeof(MyModelValidator));

    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(MyModel));

    // register other metadata classes
}

Вы можете сделать это для каждой сущности, которую вы хотите.

Используйте модели просмотра. Одна из их предполагаемых целей - абстрагировать модель (как M в MVC) объекты из взглядов.

Поместите атрибуты проверки в модели вашего представления и используйте Mapper (например, Automapper) для копирования информации в/из сущностей БД.

Использовать ModelState.IsValid В действиях вашего контроллера, чтобы проверить, действительны ли модели представления.

Мои методы действия, как правило, смотрят на это:

[HttpPost]
public virtual ActionResult Edit(EditModel model)
{
    if (!ModelState.IsValid)
        return View(model);

    try
    {
        // fetch db entity
        var template = _templateService.Get(model.Id);

        // copy info from view model to db entity
        Mapper.Map(model, template);

        // save db entity
        templateService.Save(template);

        return RedirectToAction("Details", new { id = template.Id });
    }
    catch (Exception err)
    {
        Logger.Error("Failed to save template", err);
        ModelState.AddModelError("", err);
        return View(model);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top