Как выполнить проверку MVC2 / EF4 EntityCollection с аннотациями данных? - PullRequest
1 голос
/ 19 ноября 2010

Я наконец преодолел одно препятствие и теперь могу успешно создавать новые данные модели. Теперь есть еще одна загвоздка - проверка. Большая часть проверки кажется достаточно простой, поскольку многие данные моей модели являются скалярными значениями. Однако есть связь «многие ко многим», на которую я ссылаюсь, поэтому я не уверен, как это подтвердить. Моя модель (еще раз):

Game (only listing the relevant columns):
    GameID - int (primary key, auto-incr)

Platform:
    PlatformID - int (primary key, auto-incr)
    Name - string

GamePlatform (not a visible entity):
    GameID - int (foreign key from Games)
    PlatformID - int (foreign key from Platforms)

И мой метод Create (да, я знаю, что он небрежный и дилетантский - я являюсь любителем и пытаюсь учиться. Я обязательно добавлю проверку ошибок. Я просто пытаюсь получить большая картина процесса просмотра -> controller-> validation-> persist-in-db / show):

public ActionResult CreateReview([Bind(prefix = "GameData")]Game newGame, int[] PlatformIDs)
{
    try
    {
        foreach(int i in PlatformIDs)
        {
            Platform plat = _siteDB.Platforms.Single(p => p.PlatformID == i);
            newGame.Platforms.Add(plat);
        }

        newGame.LastModified = Datetime.Now;

        _siteDB.Games.AddObject(newGame);
        _siteDB.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

Массив PlatformID предоставляется группой флажков в моем представлении. Чтобы моя игра была действительной, она должна быть связана хотя бы с одной платформой. Я просто не уверен, как это проверить с помощью аннотаций данных или вообще возможно ли это сделать. Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 19 ноября 2010

Если я правильно понимаю ваш вопрос, ваш int [] потенциально содержит целые числа, связанные с идентификатором платформы в вашей БД, и вы хотите убедиться, что ваш int [] содержит хотя бы один действительный PlatformID, верно?

Сразу же вы можете сделать простую проверку перед тем, как углубиться в свою логику:

// If there aren't any IDs in Platform that are in PlatformIDs...
if (!_siteDB.Platforms.Any(p => PlatformIDs.Contains(p.PlatformID)))
    Return RedirectToAction("Index");
    // And probably tell the user to check a box, if they did,
    // One of your checkboxes isn't matching up with your PlatformIDs

В идеале, то, что вы хотите сделать, это добавить int [] к вашей модели, чтобы вы могли проверить валидацию модели.Поскольку база данных обычно не хранит int [], добавьте его в модель вашей игры.EF, вероятно, помещает ваши DB Entities в вашу папку Models, и если вы посмотрите на них, вы увидите, что они являются частичными классами.Так что добавьте это в папку «Модели»:

public partial class Game
{
    public Dictionary<int, bool> SupportedPlatforms { get; set; }// Edited
}

// Also add this which you'll see why below
public partial class Platform
{
    public static bool IsValidPlatformID(int PlatformID)
    {
        using (SiteDBEntities _siteDB = new SiteDBEntities())
            return _siteDB.Platforms.Any(p => p.PlatformID.Equals(PlatformID));
    }
}

Затем добавьте пользовательский класс ValidationAttribute:

public ContainsValidPlatformIDAttribute : ValidationAttribute
{

    public ContainsValidPlatformIDAttribute() { }

    public override bool IsValid(object value)
    {
        Dictionary<int, bool> supportedPlatforms = (Dictionary<int, bool>)value;
        if (value == null)
            return true;
        foreach (int i in values)
        {
            if (supportedPlatforms.Values.Any(b => b.Equals(true)))// Edited
                return false;
        }
        return true;
}

Теперь украсьте им свою собственность в классе Игры:

[ContainsValidPlatformID(Error = "You did not select a valid Platform.")]
public Dictionary<int, bool> SupportedPlatforms { get; set; }// Edited

(Отредактировано) Теперь вместо жесткого кодирования флажка для каждой платформы добавьте это вместо:

<%: Html.CheckboxFor(model => model.SupportedPlatforms[0]) %>
<%: Html.ValidationMessageFor(model => model.SupportedPlatforms[0]) %>

(Отредактировано) Теперь ваши флажки привязаны к модели, вы можете проверить модель в контроллереи вы можете удалить аргумент int [] из вашего метода Action.Все это было закодировано из моей головы в этом редакторе, поэтому вам может понадобиться настроить некоторые вещи здесь и там, но это направление, в котором вы должны двигаться при работе с моделями в представлениях.

Кроме того, посмотрите, чтоСкотт Гатри написал в своем блоге тему Проверка модели MVC .Надеюсь, с моим образцом и блогом Скотта вы будете направлены в правильном направлении.

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