如何使用 MVC 5 进行服务器端验证

问题描述 投票:0回答:2

我正在为慈善机构开发一个简单的拍卖网站。我有一个用于销售商品的

Item
模型,以及一个
Bid
视图,用户可以在其中输入出价并提交。该出价在项目控制器内接收:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Bid(int itemID, int bidAmount)
    {
        if (ModelState.IsValid)
        {
            Item item = db.Items.Find(itemID);
            if (bidAmount >= item.NextBid)
            {
                item.Bids++;
                item.CurrentBid = bidAmount;
                item.HighBidder = HttpContext.User.Identity.Name;
                db.Entry(item).State = EntityState.Modified;
                db.SaveChanges();
            }
            else
            {
                // Already outbid
            }
            return View(item);
        }
        return RedirectToAction("Auction");
    }

我想知道如何向用户显示服务器端验证。例如,在上面的代码中,可能是提交的出价金额不再足够。在这种情况下,我想向用户显示一条消息,表明他们的出价已被超过等。

如何将此信息传递回视图以显示适当的消息?我希望用户看到与以前相同的项目页面视图,更新编辑框中的值并显示消息 - 类似于 eBay。谢谢。

c# asp.net-mvc validation server-side-validation
2个回答
16
投票

您应该看看

AddModelError
属性的
ModelState
方法。

   [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Bid(int itemID, int bidAmount)
    {
        if (ModelState.IsValid)
        {
            Item item = db.Items.Find(itemID);
            if (bidAmount >= item.NextBid)
            {
                item.Bids++;
                item.CurrentBid = bidAmount;
                item.HighBidder = HttpContext.User.Identity.Name;
                db.Entry(item).State = EntityState.Modified;
                db.SaveChanges();
            }
            else
            {
                // Already outbid
                ModelState.AddModelError("", "Already outbid");
            }
            return View(item);
        }
        return RedirectToAction("Auction");
    }

要在视图中显示消息,您需要一个

ValidationSummary
:

@Html.ValidationSummary(true)

0
投票

为了更好地理解服务器端验证,下面给出了服务器端电影名称验证的代码片段

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateMovie(Movie movie)
    {
        var userExist = _context.Movies.Where(l => l.Name == movie.Name ).FirstOrDefault();

        if (userExist != null )
        {
            ModelState.AddModelError("error", "This Movie  Name is already registered");
            return View();
        }

        if (ModelState.IsValid)
        {
            _context.Movies.Add(movie);

            try
            {
                _context.SaveChanges();

            }
            catch (DbEntityValidationException e)
            {
                Console.WriteLine(e);
            }


        }

        return RedirectToAction("Index", "Movies");
    }

并且不要忘记在视图中添加以下代码片段

@Html.ValidationMessage("error", new { @class = "text-danger" })
© www.soinside.com 2019 - 2024. All rights reserved.