多 select 下拉项自动 select 属性更新
Multi select drop-down items auto select attribute on update
在一个页面上,我有多个 select 下拉菜单。每当我需要插入数据时它都能正常工作,但当我需要更新插入的数据时就会出现问题。
问题 每当我单击我的数据旁边的编辑按钮(在我的情况下 - 关于书籍数据)时,表单中的每个字段都会填满,但 select下拉菜单项不会自动 selected 到以前 selected 的内容。我必须再次手动重新select它。更新数据本身的过程工作正常(一旦我重新select它)。
它使用多对多关系。当我使用复选框时工作正常,但我想在下拉菜单上重新做。
控制者
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 项的。
表单本身使用 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>
我之后的行是<select asp-for="@Model.Book.BookAuthors" asp-items="@Model.AuthorOptions" name="author[]"></select>
。它和整个表单从我的存储库中获取数据。
存储库
public Book GetBook(int Id)
{
return db.Books.Include(x => x.BookAuthors).SingleOrDefault(x => x.Id == Id);
}
下拉里面的Value
是AuthorId
,Book
模型里面的BookAuthors
是一个IList
,连接到一个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
是一个下拉但单对单的连接)都会得到 selected 但我的作者下拉列表没有?我错过了什么?
编辑 1
通过更改 asp-for="@Model.Book.BookAuthors"
=> asp-for="@Model.Book.BookAuthors[0].AuthorId"
Does the Trick 以获得 selected 但是如果图书数据有超过 1 位作者,只有 1 位作者是 select 从下拉菜单中编辑。 + 下拉菜单不再是 multi-select,但可以通过添加属性 multiple
来覆盖,但仍然只有 select 下拉菜单中的 1 个项目。
想出了一个窍门。
在 viewModel 中创建了一个整数 public IList<int> AuthorIds
的 IList。在 .cshtml 中,int asp-for=""
使用新创建的整数列表 AuthorIds
。在控制器内部,ViewModel 中的 AuthorIds
通过 _booksRepository.GetBook(Id).BookAuthors.Select(x => 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>
没有其他变化。
在一个页面上,我有多个 select 下拉菜单。每当我需要插入数据时它都能正常工作,但当我需要更新插入的数据时就会出现问题。
问题 每当我单击我的数据旁边的编辑按钮(在我的情况下 - 关于书籍数据)时,表单中的每个字段都会填满,但 select下拉菜单项不会自动 selected 到以前 selected 的内容。我必须再次手动重新select它。更新数据本身的过程工作正常(一旦我重新select它)。
它使用多对多关系。当我使用复选框时工作正常,但我想在下拉菜单上重新做。
控制者
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 项的。
表单本身使用 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>
我之后的行是<select asp-for="@Model.Book.BookAuthors" asp-items="@Model.AuthorOptions" name="author[]"></select>
。它和整个表单从我的存储库中获取数据。
存储库
public Book GetBook(int Id)
{
return db.Books.Include(x => x.BookAuthors).SingleOrDefault(x => x.Id == Id);
}
下拉里面的Value
是AuthorId
,Book
模型里面的BookAuthors
是一个IList
,连接到一个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
是一个下拉但单对单的连接)都会得到 selected 但我的作者下拉列表没有?我错过了什么?
编辑 1
通过更改 asp-for="@Model.Book.BookAuthors"
=> asp-for="@Model.Book.BookAuthors[0].AuthorId"
Does the Trick 以获得 selected 但是如果图书数据有超过 1 位作者,只有 1 位作者是 select 从下拉菜单中编辑。 + 下拉菜单不再是 multi-select,但可以通过添加属性 multiple
来覆盖,但仍然只有 select 下拉菜单中的 1 个项目。
想出了一个窍门。
在 viewModel 中创建了一个整数 public IList<int> AuthorIds
的 IList。在 .cshtml 中,int asp-for=""
使用新创建的整数列表 AuthorIds
。在控制器内部,ViewModel 中的 AuthorIds
通过 _booksRepository.GetBook(Id).BookAuthors.Select(x => 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>
没有其他变化。