Возможно ли иметь «выборочную» проверку с аннотациями данных? - PullRequest
1 голос
/ 04 ноября 2010

У меня есть форма, которая публикует 13 объектов прямо сейчас. Некоторые из объектов могут быть необязательными, например, Referrer, другие не могут быть. Проблема заключается в том, что если я использую DAV и украшаю объекты атрибутами проверки, такими как [Required], даже если объект является необязательным, вся публикация потерпит неудачу, поскольку ModelState будет недействительным.

Я могу удалить украшение [Required] со всех объектов, но это не совсем правильно. Итак, есть ли способ выборочной проверки отдельных объектов при использовании DAV?

Учтите это:

<form>
    <input type="hidden" name="Description.AuthorId" value="{?}" />
    <p>
        <label>Office</label>
        <select name="Job.OfficeId">{?}</select>
    </p>
    <p>
        <label>Description</label>
        <textarea name="Description.Text"></textarea>
    </p>
</form>

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

public class Note {
    [Required]
    public short AuthorId { get; set; }

    [Required, StringLength(XXX)]
    public string Text { get; set; }
}

public RedirectToRouteResult Jobs(
    [Bind(Prefix = "Job", Include = "OfficeId")] Job Job,
    [Bind(Prefix = "Description", Include = "AuthorId,Text")] Note Description) {
    if (ModelState.IsValid) {
        if (Description != null) {
            Description.Job = Job;
        };

        DataContext.Jobs.InsertOnSubmit(Job);
        DataContext.SubmitChanges();
    };
}

Первая проблема с методом заключается в том, что из-за формы Description всегда будет генерироваться, потому что форма всегда будет проходить Description.AuthorId, поэтому условная проверка, если Description равно нулю, никогда не будет вызвана, даже если Description.Text не был заполнен.

Вторая проблема связана с DAV, если Description.Text не заполнен, тогда вся модель не пройдёт проверку, так как это обязательное поле для Note. Таким образом, у меня даже не было бы возможности сделать что-нибудь еще.

Итак, я предполагаю, что мой вопрос заключается в том, как правильно реализовать проверку (DAV?) Для объекта, который может быть необязательным в форме пользовательского интерфейса, но сам по себе имеет обязательные поля из-за структуры базы данных?

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

Помощь будет высоко ценится!

1 Ответ

0 голосов
/ 06 апреля 2011

Мое предложение будет состоять в том, чтобы создать модели представлений (простые модели, которые используются для данных / проверки представлений и привязки моделей и сопоставляются с моделями БД позднее) для таких случаев. Попытка протолкнуть вокруг вас бизнес / модели БД со всеми проверками не всегда будет возможна. Если модель в некоторых местах проверена иначе, чем, скорее всего, вы заставляете круглый колышек в квадратном отверстии только потому, что они оба зеленого цвета. Если вам абсолютно необходимо использовать одни и те же объекты из-за некоторых ограничений, вы можете игнорировать проверку или удалять ошибочные ошибки из словаря ModelState на контроллере, но это не очень хорошая идея.

...