Toby Sharp
Toby Sharp

Reputation: 2059

How to do server-side validation using MVC 5

I am working on a simple auction website for a charity. I have an Item model for the sale items, and a Bid view where the user can enter a bid and submit it. This bid is received inside the Item controller:

    [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");
    }

I would like to know how to display server-side validation to the user. For example, in the above code, it may be that the submitted bid amount is no longer sufficient. In that case, I would like to display a message to the user that they have been outbid etc.

How can I pass this information back to the view to display an appropriate message? I want the user to see the same item page view as before, updating the value in the edit box and displaying the message - similar to eBay. Thanks.

Upvotes: 6

Views: 17502

Answers (2)

Andre Kraemer
Andre Kraemer

Reputation: 2761

You should have a look at the AddModelError method of the ModelState property.

   [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");
    }

To display the message in your view, you need a ValidationSummary:

@Html.ValidationSummary(true)

Upvotes: 16

Mahmud
Mahmud

Reputation: 383

For a better understanding of server-side validation a code snippet of movie name validation in server side is given below

    [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");
    }

and don't forget to add in view the following code snippet

@Html.ValidationMessage("error", new { @class = "text-danger" })

Upvotes: 0

Related Questions