使用实体属性进行数据验证

时间:2018-05-24 15:19:36

标签: asp.net-mvc entity-framework validation

我正在使用ASP.NET MVC创建一个小型拍卖网站。我是ASP的新手,并不确定所有功能是如何工作的。我正在进行的拍卖部分是对当前项目进行投标。现在我在我的(出价)模型中进行了简单验证,如下所示:

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

当用户想要出价时,会通过“创建”视图为他们输入最高出价。我只是简单地验证它们实际上输入了一个值并且它是非负的。

  

但是,更准确地说,他们必须输入一个高于特定item.Bid.CurBid值的值。

     

有没有办法验证上述验证,它不会让用户实际创建出价并立即给出错误消息?

感谢您的帮助。

修改 所以在我的BidsController中的Create方法中,我添加了以下代码:

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 :(得分:2)

一般来说,最终验证应该在业务层而不是在viewmodel上完成。这一点很重要,但是在您的架构的这个阶段最重要的可能是它可以帮助您保持代码的有序性。无论如何,在任何合理的情况下,如此少量信息的商业层之旅将是几分之一秒。

一旦你在那里,你的验证非常简单。假设您有一些双m表示目前为止的最高出价,而某些双n表示当前出价,您只需要检查n > m。如果不是,您可以将拒绝消息发送回UI。值得注意的是,这不应该是一个例外:用户正在为您提供您希望偶尔接收并确切知道如何处理的输入。只需生成一条消息,通知用户其出价低于m,因此无效,并允许他们在选择时输入新的出价。

在您进行了后端验证后,您可以自由地回到前端并在那里编写初步验证逻辑。此验证不会万无一失,并且通常甚至不会包含一整套验证步骤。目标是确保您的前端验证保持轻量级,同时仍能捕获大多数错误。在这种特殊情况下,这可能意味着对最后一次出价的缓存值运行支票,并执行付款的基本验证步骤,例如针对信用卡信息的Luhn Algorithm checks