2012-04-26 64 views
0

当前我正在检查选定的项目ID并在显示上一个选定项目的编辑页面的下拉列表中显示。项目根据其活动状态显示。所有活动项目都显示在下拉列表中,如果用户的上一个选择选项当前处于非活动状态,则它应该仍然默认为下拉列表中的该项目,因为它是之前所做的选择。我的问题是,我无法显示用户在编辑页面上选择的非活动项目。我会后我的代码,这是在不同的环节问了一个问题的延续:passing null parameters检查清单项目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方法和一个调用GetItems()方法的Create方法。任何帮助都会很棒。谢谢: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); 
    } 

***** SOLUTION *****

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

在您的viewModel中初始化了appointmentId。这是一个错字吗?你说你的ViewModel中甚至没有AppointmentId。 – DMulligan 2012-04-26 20:43:18

+0

我的坏...我没有添加它认为它不是问题的一部分。我删除了一些像startDate和其他并没有处理getItems的东西。但是约会是初始化的。 – Masriyah 2012-04-26 20:48:57

+1

我的观点是你在你的viewmodel中设置了appointmentId而不是itemdescriptionid。 – DMulligan 2012-04-26 21:08:10

回答

0

原因代码不查询以前选择的值是因为您的查询a.ItemDescriptionId == viewModel.ItemDescriptionId,比较项目说明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.Items= GetItems(appointment.ItemDescriptionId); 

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

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

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

+0

我只是试过这个,现在我得到一个错误页面指出:无法从类型'System.Guid'转换为键入'System.Int16'。 – Masriyah 2012-04-26 20:17:23

+0

错误在哪里?你的itemDescriptionId是一个guid还是一个整数?你的代码从来没有被正确查询的初始原因是你只在viewmodel中设置了appointmentId,然后你比较itemDescriptionId,它始终为null /默认值。 – DMulligan 2012-04-26 20:19:33

+0

我相信这是itemDescriptionId始终为空的问题,我无法将其包裹在头上。我得到的错误消息是在我的视图页面.cshtml文件中,红线是:self.items = @ Html.Raw(Json.Encode(Model.Items)); – Masriyah 2012-04-26 20:21:58