选择下拉列表不保存所选选项-ASP.NET核心Web应用程序 [英] Select dropdown list doesn't save selected option - asp.net core web app

查看:44
本文介绍了选择下拉列表不保存所选选项-ASP.NET核心Web应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试将数据保存在表中,但由于某种原因,HTML的Select元素始终保存第一个DateTime选项项,而不是保存我选择的项。

在这里我选择了与突出显示的日期对应的选项,但当我保存信息时,第一个选项(22-01-08)是它保存在数据库表上的选项

我的视图模型:

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;  }  
}

我设置函数的控制器将从视图检索的数据保存到";cart";表:

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

我的看法:

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>

推荐答案

我在这里看到几个问题。

<select>元素的name属性错误。您可以删除name="ok"(和id),因为tag-helperasp-for会自动设置nameid属性。如果将其更改为:

,则它应该正确绑定到FilmeDate属性
<select asp-for="FilmeDate" class="form-control" asp-items="ViewBag.FilmeDate"></select>
您正在使用日期填充ViewBag,但将值分配给Id而不是日期。在值域中也使用日期:

...
    .Select(i => new SelectListItem
     {
         Value = i.Date.ToString(),
         Text = i.Date.ToString()
     }
然而,另一个问题是在保存到数据库时没有使用视图模型中的值。看起来您正在保存刚刚从数据库中读取的值:Date = sessao.Date。您应该使用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();

您只需要一个循环,您也可以在添加所有项之后保存更改。由于您不再在Post方法中使用sessao,因此可以将其删除。

旁白:如果您正在检查checkSeat(seatNum, filmeId)中特定电影的座位是否可用,您可能还需要考虑电影日期。

这篇关于选择下拉列表不保存所选选项-ASP.NET核心Web应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆