简体   繁体   中英

Select dropdown list doesn't save selected option - asp.net core web app

I'm trying to save data on a table but for some reason the Select element of Html always saves the first DateTime option item instead of saving the one I selected.

Here I select the option corresponding to the date highlighted but when I save the information the first option (22-01-08) is the one that it´s saved on the database table

落下

数据库

My View Model:

 public class BookNowViewModel
{
    public string FilmeName { get; set; }
  
    public DateTime FilmeDate { get; set; }
    public string seatNum { get; set; }
    public int Price { get; set; }
    public int FilmeId { get; set;  }

}

My Controller where i set the functions do save the data retrieved from the view to the "Cart" table:

[HttpGet]
    public  IActionResult BookNow(int Id)
    {
        BookNowViewModel vm = new BookNowViewModel();
        var item =  _context.Filme.Where(a => a.Id == Id).FirstOrDefault();
        var it = _context.Sessao.Where(n => n.FilmeId == Id).FirstOrDefault();
        vm.FilmeName = item.Name;
        vm.FilmeDate = it.Date;
        vm.FilmeId = Id;
        vm.Price = Convert.ToInt32(item.Price);

        ViewBag.FilmeDate = _context.Sessao.Where(a => a.FilmeId == Id)
                 .Select(i => new SelectListItem
                 {
                     Value = i.Id.ToString(),
                     Text = i.Date.ToString()
                 }).ToList();

        return  View(vm);
    }

    
    [HttpPost]
    public async Task<IActionResult> BookNow(BookNowViewModel vm,int Id)
    {
        
        
        List<Cart> carts = new List<Cart>();
        string seatNum = vm.seatNum.ToString();
        int filmeId = vm.FilmeId;
        var filme = _context.Filme.Where(a => a.Id == Id).FirstOrDefault();
        var sessao = _context.Sessao.Where(n => n.FilmeId == Id).FirstOrDefault();

        string[] seatNumArray = seatNum.Split(",");
        count = seatNumArray.Length;


        if (checkSeat(seatNum, filmeId) == false)
            {

                foreach (var item in seatNumArray)
                {
                    carts.Add(new Cart
                    {

                        Price = Convert.ToInt32(filme.Price),
                        MovieId = vm.FilmeId,
                        UserId = _userManager.GetUserId(HttpContext.User),
                        Date = sessao.Date,
                        seatNum = item
                    });;
                }
                foreach (var item in carts)
                {
                    _context.Cart.Add(item);
                    await _context.SaveChangesAsync();
                    //_context.SaveChanges();
                }
          
            TempData["Sucess"] = "Seat Booked, See your Cart";
            }
            else
            {
                TempData["seatnummsg"] = "Please Change you seat number";
            }

        return RedirectToAction("Index");
        
    }

My View:

div class="col-md-4">
<form asp-action="BookNow" enctype="multipart/form-data">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="FilmeName" class="control-label"></label>
        @Model.FilmeName
        <span asp-validation-for="FilmeName" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="FilmeDate" class="control-label"></label>
        <select name="ok" id="FilmeDate" asp-for="FilmeDate" class="form-control" asp-items="ViewBag.FilmeDate"></select>
    </div>


    <div class="form-group">
        <label asp-for="seatNum" class="control-label"></label>
        <input asp-for="seatNum" class="form-control" />
        <span asp-validation-for="seatNum" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="FilmeId" class="control-label"></label>
        <input asp-for="FilmeId" class="form-control" />
        <span asp-validation-for="FilmeId" class="text-danger"></span>
    </div>

    <div class="form-group">
        <input type="submit" value="Add to Cart" class="btn btn-default btn-success text-white" />
    </div>
</form>

I can see a couple of issues here.

You're populating the ViewBag with dates, but you're assigning the value to the Id not the Date. Use the date in the value field too:

...
    .Select(i => new SelectListItem
     {
         Value = i.Date.ToString(),
         Text = i.Date.ToString()
     }

However, another problem is that you're not using the value from the viewmodel when saving to the database. It looks like you're saving a value which you just read from the database: Date = sessao.Date . You should use the value from the ViewModel: Date = vm.FilmeDate .

...
    // only 1 for loop required
    foreach (var item in seatNumArray)
    {
        var cart = new Cart
        {    
            Price = Convert.ToInt32(filme.Price),
            MovieId = vm.FilmeId,
            UserId = _userManager.GetUserId(HttpContext.User),
            Date = vm.FilmeDate, // use the value selected the viewmodel
            seatNum = item
        };
        _context.Cart.Add(cart);                        
    }
    // save changes after adding all items
    await _context.SaveChangesAsync();

You only need a single loop and you can save changes after adding all items too. Since you're no longer using sessao in the Post method it can be removed.

Aside: if you're checking for seat availability for a particular film in checkSeat(seatNum, filmeId) , you may also need to consider the film date too.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM