【问题标题】:Checking List Item Id检查列表项 ID
【发布时间】:2012-04-26 19:34:29
【问题描述】:

目前我正在尝试检查选定的项目 ID 并显示在编辑页面的下拉列表中,该页面将显示上一个选定的项目。项目根据其活动状态显示。所有活动项目都显示在下拉列表中,如果用户先前的选择选项当前处于非活动状态,它仍应默认为下拉列表中的该项目,因为它是先前所做的选择。我的问题是我无法在编辑页面上显示用户选择的非活动项目。我将发布我的所有代码,这是在另一个链接中提出的问题的延续:passing null parameters

我在控制器中的代码:

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

我在 CONTROLLER 中的编辑方法:

[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.Items= GetItems() 中将 viewModel 作为参数传递并没有太大作用。我还有另一个用于 Edit 的 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()});
    }

【问题讨论】:

  • 在您的 viewModel 中初始化约会 ID。这是一个错字吗?你说你的 ViewModel 中甚至没有 AppointmentId。
  • 我的错...我没有添加它,因为它不是问题的一部分。我删除了一些东西,比如 startDate 和其他不真正处理 getItems 的东西。但是是的,约会ID 已初始化。
  • 我的意思是您在 viewmodel 中设置了约会 ID 而不是 itemdescriptionid。

标签: c# asp.net-mvc


【解决方案1】:

您的初始代码未查询先前选择的值的原因是因为您的查询 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()});
}

当您使用 ViewModel 只是为了获取必要的 Guid 时,传入 ViewModel 是很愚蠢的。然后像这样称呼它

viewModel.Items= GetItems(appointment.ItemDescriptionId);

如果您的查询仍然没有添加正确的项目,请尝试调试它。

var testExists = itemDescriptionRepository.FindAll().FirstOrDefault(a.ItemDescriptionId == lastId);

如果您没有找到它,并且您确定 lastId 设置正确,则可能是数据库问题。

【讨论】:

  • 我刚试过这个,现在我得到一个错误页面,指出:无法从类型“System.Guid”转换为类型“System.Int16”。
  • 错误在哪里?您的 itemDescriptionId 是 guid 还是整数?您的代码从未正确查询的最初原因是您仅在视图模型中设置了约会 ID,然后您与 itemDescriptionId 进行比较,它始终为空/默认值。
  • 我相信这就是 itemDescriptionId 始终为空的问题,我无法理解它。我收到的错误消息在我的视图页面 .cshtml 文件中,红线是:self.items = @Html.Raw(Json.Encode(Model.Items));
  • ItemDescriptionId 将始终为空,因为您从未在任何地方设置它。您从未在 ViewModel 中设置,当您创建这些 SearchItems 时,您创建的唯一值是 Text 和 Value。
  • 由于此代码正在查看编辑页面,因此应该在 Create 方法中设置 itemDescriptionId 对吗?并且无论创建什么,编辑页面都在提供它。
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
相关资源
最近更新 更多