2012-04-26 107 views
0

我目前在解决这个问题时遇到了一些麻烦。我有一个方法,不需要任何参数,现在我需要添加一个参数,但我不想在调用该方法的所有不同位置添加参数。这是我目前的方法:传递null参数

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null) 
    { 
     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 || viewModel == null || a.ItemDescriptionId == viewModel.ItemDescriptionId).Select(
       c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
    } 

我试着传递null作为其他地方的参数调用此方法,但我得到一个错误。什么方式来超载这个问题?

目的:添加viewModel的目的是因为我有一个下拉列表与活动项目可供选择。一旦用户选择活动项目,然后出于某种原因该项目变为非活动状态并且用户去编辑他们的选择。在下拉列表中应该有活动项目的列表以及他们之前选择的项目现在不活动。我正在使用ViewModel来检查先前选择的项目的ID。

感谢

+0

你会得到什么错误? – nemesv 2012-04-26 13:40:16

+0

@Amina:null是viewModel参数的有效值吗? – Dennis 2012-04-26 13:41:26

+0

@丹尼斯我有这样的参数:ItemDescriptionFormViewModel viewModel = null。 – Masriyah 2012-04-26 13:47:14

回答

0

大家...感谢您尝试解决此问题的所有帮助和努力。我终于能够解决它,这里是我解决了我的问题的人:Checking List Item Id

0

声明它是这样的:

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null) 

,并确保有一个null检查在你的方法,这样的事情:

return 
     _itemDescriptionRepository.FindAll().OrderBy(c => c.Description).Where(a=> viewModel == null || (a.IsActive == true || a.ItemDescriptionId == viewModel.ItemDescriptionId)).Select(
      c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 

这将允许你打电话使用GetItems()GetItems(ItemDescriptionFormViewModel viewModel)的方法

编辑:无视?因为ItemDescriptionFormViewModel是一类

+0

当我尝试这个我有一个对象引用未设置为对象错误的实例。它指的是我的.cshtml查看页面。 – Masriyah 2012-04-26 14:05:44

+0

什么对象你会得到那个错误?你在方法的其他地方使用viewModel吗? – DangerMonkey 2012-04-26 14:10:15

+0

确切的行是:self.items = @ Html.Raw(Json.Encode(Mode.Items)); 在方法我目前有我唯一的时间使用viewModel只是检查一个项目的代码,我目前在代码中。 – Masriyah 2012-04-26 14:13:31

0

你在这里提领一空引用:

_itemDescriptionRepository.FindAll() 
    .OrderBy(c => c.Description) 
    .Where(a=>a.IsActive == true || 
     a.ItemDescriptionId == viewModel.ItemDescriptionId) // if viewModel null, this throws 
    .Select(c => new SearchItems 
    { 
     Text = c.Description, Value = c.ItemDescriptionId.ToString() 
    }); 

所以你可以只更新Where()条款添加通如果视图模型为空:

... 
.Where(a => a.IsActive || viewModel == null || viewModel.ItemDescriptionId == a.ItemDescriptionId) 

然后,您可以安全地通过null作为参数,甚至可以设置默认参数值,因此如果没有参数传递,它将采用null

这是当然的,假设ItemDescriptionFormViewModel是一类,如果它是一个结构,那么你就必须使其可为空ItemDescriptionFormViewModel?

+0

当我调整代码时,我得到的对象引用未设置为我的.cshtml视图页上的对象错误的实例。 – Masriyah 2012-04-26 14:07:49

+0

@Amina:在哪一行?这是唯一使用viewModel的地方。你能用最新的代码更新你的问题吗? – 2012-04-26 14:20:53

+0

我更新了自己的代码。确切的错误行在我的视图页面中:self.items = @ Html.Raw(Json.Encode(Model.Items));以及我之前评论中提到的错误消息。我对这个错误有些困惑。会显示我的viewModel帮助吗?我非常感谢帮助 - 谢谢。 – Masriyah 2012-04-26 14:28:08

0

如果你想保留这两种方法(我的意思是GetItems()和GetItems (viewModel))它们会自动超载。

如果你想在第二个方法,你可以传递参数这样

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel? viewModel) 

现在,你可以把null作为它的参数。

+0

只有当ItemDescriptionFormViewModel是一个值类型,即一个结构。此外,您还需要记住检查'viewModel.HasValue',如果返回true,则可以通过'viewModel.Value'获取它的值。 – 2012-04-26 13:55:27

+0

这对我不适用cuz ItemDescriptionFormViewModel是一个类。 – Masriyah 2012-04-26 14:06:17

2

您可以将默认值赋给viewModel

private IEnumerable<SearchItems> GetItems(
    ItemDescriptionFormViewModel viewModel = null) 
{ 
    if (viewModel == null) 
     viewModel = new ItemDescriptionFormViewModel(); 

这样一来,如果你只需调用GetItems(),它将把viewModel作为new ItemDescriptionFormViewModel()

+0

当我试着这个我得到这个错误:'viewModel'的默认参数值必须是一个编译时常数 – Masriyah 2012-04-26 14:02:33

+0

所以我认为你必须使用默认值ItemDescriptionFormViewModel viewModel = null和比较值。 – 2012-04-26 14:15:25

+0

我做了这也是别人建议,但现在我得到的对象引用没有设置为对象错误的实例。 – Masriyah 2012-04-26 14:17:08