Проверка данных с использованием свойства объекта - PullRequest
0 голосов
/ 24 мая 2018

Я создаю небольшой аукционный сайт с ASP.NET MVC.Я чрезвычайно новичок в ASP и не уверен, как работает весь функционал.Часть аукциона, над которой я работаю, это торги по текущему предмету.Прямо сейчас у меня есть простая проверка в моей модели (Bid):

[Required(ErrorMessage = "Please enter a maximum bid")]
    [Range(0, double.PositiveInfinity)]
    public decimal MaxBid { get; set; }

Когда пользователь хочет сделать ставку, ему предоставляется форма через представление «Создать», где он вводит свою максимальную ставку.,То, что я имею, просто на лету проверяет, что они действительно вводят значение и что оно неотрицательно.

Однако, более точно, они должны ввести значение выше, чем конкретное значение item.Bid.CurBid.

Существует ли способ проверки, подобный описанному выше, где он не позволяет пользователю фактически создать ставку и мгновенно выдает сообщение об ошибке?

Спасибо за любую помощь.

Редактировать: Итак, в моем методе Create в моем BidsController я добавил следующий код:

public ActionResult Create([Bind(Include = "BidId,ItemId,BidderId,MaxBid,CurBid,BidDate,BidStatusId")] Bid bid, Guid itemId, string usrId)
    {
        if (ModelState.IsValid)
        {
            Item item = db.Items.Find(itemId);
            Bid activeBid = db.Bids.Find(item.ActiveBidId);

            if(bid.MaxBid < activeBid.CurBid)
            {
                ModelState.AddModelError(string.Empty, "Your maximum bid must be greater than the current bid.");
                return RedirectToAction("Create", "Bids", new {itemId, usrId});
            }

Я попытался добавить эту ошибку модели, чтобы она отображалась, как и другие ошибки, в моем представлении "Создать" ставку.Однако ошибка не отображается.Это потому, что я не возвращаю модель ставок, а перенаправляю на страницу просмотра "Создать"?

Код для моего представления «Создать»:

<h4>Bid</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        @Html.LabelFor(model => model.MaxBid, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.MaxBid, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.MaxBid, "", new { @class = "text-danger" })
        </div>
    </div>

Я думал, что в сводке проверки будет отображаться мое сообщение об ошибке.

1 Ответ

0 голосов
/ 24 мая 2018

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

Как только вы там, ваша проверка довольно проста.Предполагая, что у вас есть некоторая двойная m, которая представляет наибольшую ставку на данный момент, и некоторая двойная n, представляющая текущую ставку, вам просто нужно проверить, что n > m.Если это не так, вы можете отправить сообщение об отказе в интерфейс пользователя.Примечательно, что это не должно быть исключением: пользователь дает вам информацию, которую вы ожидаете получить, и точно знаете, как с ней обращаться.Просто создайте сообщение, информирующее пользователя о том, что его ставка ниже, чем m, и, следовательно, является недействительным, и разрешите ему ввести новую ставку, если они того пожелают.

После того, как вы поставили свой бэкэндпроверка на месте, вы можете вернуться обратно к интерфейсу и написать предварительную логику проверки.Эта проверка не будет надежной и часто даже не будет содержать полный набор шагов проверки.Цель состоит в том, чтобы убедиться, что ваша интерфейсная проверка остается легкой, но при этом выявляет большинство ошибок.В данном конкретном случае это, скорее всего, означает выполнение ваших проверок по кешированному значению последней ставки, а также выполнение основных этапов проверки платежа, таких как Алгоритм Luhn * проверяет на данные кредитной карты.

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