Ошибка отображения, даже если Model.IsValid возвращает true - PullRequest
0 голосов
/ 08 февраля 2019

Я делаю сайт, который извлекает некоторую информацию из базы данных SQL.Я сделал Модель для проверки того, что у меня есть информация, которая мне нужна, прежде чем я попробую запрос.Это означает (если все пойдет правильно), метод всегда разрешается, и Model.IsValid будет истинным.Запрос состоит в том, чтобы получить все строки между двумя указанными датами.

Теперь возникает моя проблема - когда он попадает в ActionResult, где он вызывает запрос, я сначала хочу проверить, не является ли количество возвращаемых строк меньше 1000.

Если это <1000, я хочу, чтобы оно показывало представление со строками, однако, если оно больше 1000, я хочу, чтобы отображалось сообщение об ошибке, которое говорит пользователю сузить критерии поиска. </p>

Я мог бы пойти по этому пути совершенно неправильно, и моей первоначальной идеей было «просто» изменить валидатор, чтобы он больше не действовал.Который автоматически вызовет сообщение об ошибке от модели.Хотя после поиска вокруг это не представляется возможным.

У кого-нибудь есть идеи, как это сделать?Совершенно неверно в моем подходе?

ValidatorModel:

public class DateValidator
{        
    [Required]
    public DateTime StartDateTime { get; set; }
    [Required]
    public DateTime EndDateTime { get; set; }
}

ActionResult:

public ActionResult GetListFromDateRange(DateValidator validator)
{
    RangeParent parent = new RangeParent();

    if (ModelState.IsValid)
    {
        int queryCount =
        repository.GetCountFromDateRange(validator.StartDateTime,
        validator.EndDateTime);

        if (queryCount < 1000)
        {
            parent.Meters =
            repository.GetListFromDateRange(validator.StartDateTime,
            validator.EndDateTime);
            return View(Constants.ViewNames.DisplayRangeData, parent);

        }
        else
        {
            //display error message telling user to narrow the datetime range
            return new EmptyResult();

        }
    }
    return View(Constants.ViewNames.IndexView);
}

И последний из двух запросов, которые я сейчас использую:

public List<Meter> GetListFromDateRange(DateTime startDateTime, DateTime endDateTime)
{
    using (dbContext = new HeatDataVerifEntities())
    {
        return dbContext.Meters.Where(p => p.Created >= startDateTime && p.Created <= endDateTime).OrderBy(p => p.Created).ToList();
    }
}

public int GetCountFromDateRange(DateTime startDateTime, DateTime endDateTime)
{
    using (dbContext = new HeatDataVerifEntities())
    {
        return dbContext.Meters.Where(p => p.Created >= startDateTime && p.Created <= endDateTime).Count();

    }
}

Еще одна вещь, которую я рассмотрел, - это создать еще один ActionResult, который запускает проверку размера строки, которую я бы назвал вместо GetListFromDateRange, и затем заставить либо вернуть пустое частичное представление вместе с вызовом метода для получения спискаэлемент или возвращая частичное представление, в котором есть сообщение об ошибке.Казалось, что это должно быть более простым или более разумным решением.

Опять же, я искал вокруг, но, как я уже упоминал, я мог бы просто просто смотреть на это неправильно.

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

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

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

Вместо этого, почему бы вам просто не добавить нумерацию страниц?Определите размер страницы, скажем, 20, верните эти записи из вашего запроса вместе с количеством страниц, необходимых для отображения всех данных.Затем вы можете использовать это для создания пагинации страницы.Таким образом, вы никогда не вернете более 20 строк из вашей базы данных, давление минимально, сайт работает быстро.

То, как вы идете сейчас, вы запрашиваете много данных, и если у вас больше 1000записи все, что вы делаете, это отображать сообщение об ошибке, ожидая, что пользователь сделает другой запрос.У вас уже есть данные, но вы не используете их ни для чего, кроме подсчета.Если нет курса, все, что вы делаете, это сначала запускаете счетчик, а затем, если меньше 1000, тогда вы выполняете фактический запрос.

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

Если вы хотите продолжить свою идею, сначала выполните запрос подсчета, если результат больше 1000, а затем верните сообщение об ошибкеи отобразить это пользователю.Вы можете сделать это без какого-либо специального, не модельного подтверждения.

0 голосов
/ 08 февраля 2019

Вы всегда можете добавить собственное сообщение об ошибке, которое будет отображаться в ValidationSummary

ModelState.AddModelError(string.Empty, "My own error message");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...