检查列表项 ID
本文关键字:ID 列表 检查 | 更新日期: 2023-09-27 18:32:26
目前我正在尝试检查选定的项目 ID 并显示在编辑页面上的下拉列表中,该页面将显示上一个选定的项目。项目根据其活动状态显示。所有活动项都显示在下拉列表中,如果用户的先前选择选项当前处于非活动状态,则它仍应默认为下拉列表中的该项,因为它是之前所做的选择。我的问题是我无法在编辑页面上显示用户选择的非活动项目。我将发布我的所有代码,这是在不同链接中提出的问题的延续:传递空参数
我在控制器中的代码:
private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null)
{
if(viewModel == null)
viewModel = new AppointmentViewModel();
IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll().OrderBy(
c => c.Sort == null).ThenBy(
c => c.Sort).ThenBy(c => c.Description);
if(items.Count()==0)
ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural));
return
_itemDescriptionRepository.FindAll().OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == viewModel.ItemDescriptionId).Select(
c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()});
}
我在控制器中的编辑方法:
[HttpGet]
[AppointmentAuthorization]
public ActionResult Edit(Guid appointmentId)
{
Appointment appointment = _appointmentService.Get(appointmentId);
if (appointment == null) return View("NotFound");
var viewModel = new AppointmentViewModel
{
AppointmentId = appointment.AppointmentId,
};
viewModel.Items= GetItems();
return this.RazorView("Edit", viewModel);
}
似乎缺少一些东西,将viewModel作为viewModel.Items= GetItems()中的参数传递并没有做太多事情。我还有另一个用于编辑的 Post 方法和一个 Create 方法,它们都调用 GetItems() 方法。任何帮助都会很棒。谢谢:D
这是我在 ViewModel 类中的内容:
public IEnumberable<SearchItems> Items {get; set;}
public Guid ItemDescriptionid {get; set;}
创建方法:
[HttpGet]
[AppointmentAuthorization]
public ActionResult Create(Guid caseId)
{
var viewModel = new AppointmentViewModel
{
Items= GetItems()
};
return this.RazorView("Create", viewModel);
}
*****溶液*****
private IEnumerable<SearchItems> GetItems(Appointment appointment)
{
IEnumerable<short?> itemDescriptionIds =
appointment.AppointmentItems.Where(c => c.ItemDescriptionId.HasValue).Select(
c => c.ItemDescriptionId).Distinct();
IOrderedQueryable<ItemDescription> itemDescription =
_itemDescriptionRepository.FindAll().Where(
a => a.IsActive == true || itemDescriptionIds.Contains(a.ItemDescriptionId)).OrderBy(
d => d.Description);
return itemDescription.Select(c=> new SearchItems{Text = c.Description, Value = c.ItemDescriptionId.ToString()});
}
初始代码未查询先前选择的值的原因是查询a.ItemDescriptionId == viewModel.ItemDescriptionId
比较项目描述 ID,但在视图模型中仅设置约会 ID。如果您需要项目描述 ID,请确保对其进行初始化。
var viewModel = new AppointmentViewModel
{
AppointmentId = appointment.AppointmentId,
ItemDescriptionId = appointment.ItemDescriptionId
};
建议的重构:
private IEnumerable<SearchItems> GetItems(Guid lastId = new Guid())
{
IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll();
if(!items.Any())
ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural));
return items
.OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == lastId)
.Select(c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()});
}
当您使用它只是采取必要的 Guid 时,传入 ViewModel 是愚蠢的。然后像这样称呼它
viewModel.Items= GetItems(appointment.ItemDescriptionId);
如果你的查询仍然没有添加正确的项目,请尝试调试它。
var testExists = itemDescriptionRepository.FindAll().FirstOrDefault(a.ItemDescriptionId == lastId);
如果您没有找到它,并且您确定 lastId 设置正确,则可能是数据库问题。