【发布时间】:2018-02-19 13:50:37
【问题描述】:
我正在使用 ASP.NET MVC 开发一个在线库。 这是我的图书馆管理页面的视图模型:
public class ManageViewModel
{
public IPagedList<ManageBookViewModel> WholeInventory;
public IPagedList<ManageBookViewModel> CurrentInventory;
public bool OldInventoryIsShown { get; set; } = false;
}
在相应的视图中,我有一个是否显示旧库存的复选框和一个局部变量modelList,如果选中该复选框,我想将其设置为Model.WholeInventory,否则设置为Model.CurrentInventory。我使用modelList 显示一个包含所有书籍的表格,并且每次我(取消)选中复选框时都需要重置它的值,以便正确显示列表。
这可能吗?我该怎么做呢?
在我看来,我目前有:
<label class="switch">
<input id="OldInventoryIsShown" name="OldInventoryIsShown" type="checkbox" />
<span class="slider round"></span>
</label>
@{
var modelList = Model.OldInventoryIsShown ? Model.WholeInventory : Model.CurrentInventory;
}
@using (Html.BeginForm())
{
<table id="bookInventory" class="table table-hover">
<thead>
<tr>
<th>Author</th>
<th>Title</th>
....
</tr>
</thead>
@foreach (var entry in modelList)
{
<tr>
<td>@Html.DisplayFor(modelItem => entry.Author)</td>
<td>@Html.DisplayFor(modelItem => entry.Title)</td>
....
</tr>
}
</table>
<p>Page @(modelList.PageCount < modelList.PageNumber ? 0 : modelList.PageNumber) of @modelList.PageCount</p>
@Html.PagedListPager(modelList, page => Url.Action("Manage", page }))
}
控制器动作:
public ActionResult Manage(int? page)
{
var wholeInventory = _bookService.GetBooksIncludingDisabled().Select(b => Mapper.Map<Book, ManageBookViewModel>(b));
var currentInventory = _bookService.GetBooks().Select(b => Mapper.Map<Book, ManageBookViewModel>(b));
int pageSize = 3;
int pageNumber = page ?? 1;
var model = new ManageViewModel
{
WholeInventory = wholeInventory.ToPagedList(pageNumber, pageSize),
CurrentInventory = currentInventory.ToPagedList(pageNumber, pageSize)
};
return View(model);
}
型号:
书籍.cs
public class Book
{
public int BookId { get; set; }
[Required]
[MinLength(1)]
public string Title { get; set; }
[Required]
[MinLength(1)]
public string Author { get; set; }
....
public bool IsDisabled { get; set; } = false;
public virtual ICollection<UserBook> UserBooks { get; set; }
}
ManageBookViewModel.cs
public class ManageBookViewModel
{
public int BookId { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Enter the book title")]
public string Title { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Enter the book author.")]
public string Author { get; set; }
....
public bool IsDisabled { get; set; }
}
【问题讨论】:
-
为什么你有 2 个
IPagedList<ManageBookViewModel>属性?由于您需要在服务器中填充它,那么您只需要一个属性(并根据OldInventoryIsShown的值分配其值) -
从您的角度分享所有相关部分。不清楚你用
modelList做什么 -
@StephenMuecke 嗨,最初我对如何显示图书库存有其他计划,只有两个列表。现在我添加了 OldInventoryIsShown,但我不确定在模型中使用此属性还是仅使用 ViewBag 属性或其他类型的变量是否是个好主意... WholeInventory 包括当前和旧库存。
-
但是你应该只有一个集合属性。这与使用
PagedList的任何其他过滤没有什么不同 - 你有一个<form>包括你@Html.CheckBoxFor()并使 GET 进入你的控制器方法,你根据复选框的值设置IPagedList<ManageBookViewModel> Inventory的值(和您在路由参数中包含OldInventoryIsShown的值,以便在视图中分页时保留它) -
你还需要显示控制器方法
标签: c# asp.net-mvc razor checkbox