【问题标题】:Multi select drop-down items auto select attribute on update多选下拉项目在更新时自动选择属性
【发布时间】:2020-03-26 04:48:59
【问题描述】:

在一个页面上,我有一个多选下拉菜单。每当我需要插入数据时它都可以正常工作,但是当我需要更新插入的数据时会出现问题。

问题每当我点击我的数据旁边的编辑按钮(在我的情况下 - 关于书籍数据)时,表单中的每个字段都会填满,但选择下拉菜单项不会自动选择到之前选择的内容。我必须再次手动重新选择它。更新数据本身的过程可以正常工作(一旦我再次重新选择它)。

它使用多对多关系。当我使用复选框时工作正常,但我想在下拉菜单上重新做。

控制者

public ViewResult Index(int? Id)
        {
            SelectList selectList = new SelectList(_authorRepository.GetAllAuthors()
                    .Select(x => new { x.Id, Title = x.Name + " " + x.Lastname }), "Id", "Title");
            BooksIndexViewModel viewModel = new BooksIndexViewModel()
            {
                Books = _booksRepository.GetAllBooks(),
                AuthorOptions = selectList,
                authors = _authorRepository.GetAllAuthors(),
                Book = _booksRepository.GetBook(Id ?? 0),
                publishers = _publisherRepository.GetAllPublishers(),
                indexPage = _dataRepository.Generatedata("Knygos", Id,
                    ControllerContext.RouteData.Values["controller"].ToString())
            };
            return View(viewModel);
        }

AuthorOptions 是通过 asp-items 的。 表单本身使用Book

Index.cshtml(其他行被移除,仅在左侧)

<form asp-controller="@Model.indexPage.controller" 
    asp-action="@Model.indexPage.action" 
    asp-route-id="@if (Model.indexPage.routeId.HasValue) {@Model.indexPage.routeId.Value}"  method="post">
        <div class="inputs">
            <div> <input asp-for="@Model.Book.Title" /> </div>
            <div> <select asp-for="@Model.Book.BookAuthors" 
                asp-items="@Model.AuthorOptions" name="author[]"></select> </div>
            <div>
                <select asp-for="@Model.Book.PublisherId"  
                    asp-items="@(new SelectList(Model.publishers, "Id", "Title"))"></select>
            </div>
            <div><input asp-for="@Model.Book.Cost" /></div>
            <div><input asp-for="@Model.Book.Code" /></div>
            <div><input asp-for="@Model.Book.InvNr" /></div>
            <div><input asp-for="@Model.Book.Description" /></div>
        </div>
        <button type="submit">Save</button>
    </form>

我之后的行是&lt;select asp-for="@Model.Book.BookAuthors" asp-items="@Model.AuthorOptions" name="author[]"&gt;&lt;/select&gt;。它和整个表单从我的存储库中获取数据。

存储库

public Book GetBook(int Id)
        {
            return db.Books.Include(x => x.BookAuthors).SingleOrDefault(x => x.Id == Id);
        }

下拉列表中的ValueAuthorIdBook 模型中的BookAuthorsIList 并连接到BookAuthor 模型:

public class BookAuthor
    {
        public int BookId { get; set; }
        public Book Book { get; set; }
        public int AuthorId { get; set; }
        public Author Author { get; set; }
    }

所以问题是,为什么每当我获得图书的数据(来自我的 ID)时,所有字段(包括 PublisherID,这是一个下拉但单对单连接)都会被选中,但我的作者下拉才不是?我错过了什么?

编辑 1

通过更改asp-for="@Model.Book.BookAuthors" => asp-for="@Model.Book.BookAuthors[0].AuthorId" 实现被选中但如果图书数据的作者超过 1 位,则从下拉菜单中仅选择 1 位作者。 + 下拉菜单不再是多选,但可以通过添加属性multiple 来覆盖,但仍然只能从下拉菜单中选择一项。

【问题讨论】:

    标签: c# asp.net multi-select


    【解决方案1】:

    想出了一个窍门。

    在 viewModel 中创建了一个整数 public IList&lt;int&gt; AuthorIds 的 IList。在 .cshtml 中,int asp-for="" 使用了新创建的整数列表 AuthorIds。在控制器内部,ViewModel 中的AuthorIds_booksRepository.GetBook(Id).BookAuthors.Select(x =&gt; x.AuthorId).ToList(); 一起传递

    所以项目看起来像这样:

    控制器

    public ViewResult Index(int? Id)
            {
                BooksIndexViewModel viewModel = new BooksIndexViewModel()
                {
                    Books = _booksRepository.GetAllBooks(),
                    AuthorOptions = new SelectList(_authorRepository.GetAllAuthors()
                        .Select(x => new { x.Id, Title = x.Name + " " + x.Lastname }), "Id", "Title"),
                    Book = _booksRepository.GetBook(Id),
                    publishers = _publisherRepository.GetAllPublishers(),
                    indexPage = _dataRepository.Generatedata("Knygos", Id,
                        ControllerContext.RouteData.Values["controller"].ToString())
                };
                if (Id != null)
                    viewModel.AuthorIds = _booksRepository.GetBook(Id).BookAuthors.Select(x => x.AuthorId).ToList();
                return View(viewModel);
            }
    

    cshtml

    <form asp-controller="@Model.indexPage.controller" asp-action="@Model.indexPage.action"
              asp-route-id="@if (Model.indexPage.routeId.HasValue) {@Model.indexPage.routeId.Value}" 
              method="post" class="form grid">
            <div class="inputs">
                <div><input asp-for="@Model.Book.Title" class="w100" /></div>
                <div><select asp-for="@Model.AuthorIds" asp-items="@Model.AuthorOptions"
                    name="author[]" multiple></select></div>
                <div><select asp-for="@Model.Book.PublisherId" 
                            asp-items="@(new SelectList(Model.publishers, "Id", "Title"))">
                </select></div>
                <div><input asp-for="@Model.Book.Cost" /></div>
                <div><input asp-for="@Model.Book.Code" /></div>
                <div><input asp-for="@Model.Book.InvNr" /></div>
                <div><input asp-for="@Model.Book.Description" /></div>
            </div>
            <button type="submit">Save</button>
        </form>
    

    没有其他变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多