2015-10-15 51 views
1

我已经通过并调试了我的代码,并且正在传递给GetItem()方法的ID是我期望获得的培训计划的ID和自定义表类名称正确的是(这是获得正确的自定义表。 但是返回的项目是在自定义表中的第一项(我看了在数据库中)不能与已输入的ID的项目。CustomTableItemProvider.GetItem()返回错误的项目

int id = parameter.ID; 

CustomTableItemProvider provider = new CustomTableItemProvider(CMSContext.CurrentUser); 

entity = provider.GetItem(id, TrainingPlanConstants.TrainingPlanTableName); 

无论输入什么整数值,都会返回这个不相关的自定义表项。我使用GetItems()方法完成了一项工作 - 但这并不理想,因为我知道我需要哪个CustomTableItem,并且此工作区这是一个不必要的循环。

(第7版)

+0

你可以检查当你调用'GetItem()'时查询的样子吗? http://devnet.kentico.com/docs/7_0/devguide/index.html?sql_queries_debugging.htm当你用Guid调用重载时会发生什么? – rocky

+0

@ Mutton92老实说,节省一些时间和麻烦,只需在Kentico中为您的CRUD操作设置LINQ to SQL或EF类,尤其是定制表格。它比Kentico的API更加灵活,它们非常易于安装,并且您可以自己制作查询,而不是试图找出黑盒子里正在发生的事情。 – Jerreck

+0

@Jerreck我有一个用于从自定义表中获取项目的所有操作的DLL(这是我正在更新的)。它是由我的线路经理多年前完成的,并更新了Kentico的新版本。显然他已经知道GetItem()函数的问题一段时间,并且刚刚在DLL中使用了GetItems()方法,我只是认为我会修复我们的DLL,因此它实际上起作用,因为另一个开发人员已经在整个站点中使用它不知道它不能正常工作!我已经在DLL中使用LINQ修复了它,但是Kentico应该知道该方法没有按预期工作! – Mutton92

回答

1

奇怪,因为你做了什么似乎是正确的,也许ID不是项目ID在自定义表中。您可以通过查看数据库并使用此ID运行查询来调试它,或者使用方法GetItems()检查ItemID是什么。

这里是Kentico 7一些示例: http://devnet.kentico.com/docs/7_0/devguide/index.html?custom_tables_api_examples_managing_custom_table_data.htm

解决方法可以是GetItems方法也如在一个在单证实施例来完成。如果你使用这个参数是不是表现如此沉重:

string where = "YourIDColumn = " + id; 
int topN = 1; 
string columns = "ItemID"; 

DataSet dataSet = customTableProvider.GetItems(customTableClassName, where, null, topN, columns); 

但我同意,这似乎有些奇怪,如果你有GetItem方法和你的ID。

祝您好运,调试并找到您的解决方案。

+0

您发送的链接上的所有示例都使用GetItem()方法,或者不要获取我试图替换的方法返回的CustomTableItem类型。为了避免在所有地方进行更改,我试图获取CustomTableItem,但似乎无法设法将DataTable/DataRow转换为CustomTableItem。有人有主意吗? – Mutton92

+1

就叫'CustomTableItem.New()'来我一直在调试模式下检查和在该方法所使用的ID是我想自定义表项的项ID从'DataRow'加载数据... – rocky

1

您的代码是正确的。

两件事情来验证(假设你的ID是一个有效的项目ID在你正在寻找在自定义表):

  1. 确保CMSContext.CurrentUser有权限读取被查询的自定义表格。
  2. 确保您传入正确的自定义表代码名称。似乎微不足道,但再次验证。
+0

收到 – Mutton92

+0

我建议验证的另外两件物品呢?什么是您传递给'CustomTableItemProvider'的代码名称,用户是否可以访问该自定义表格? –

+0

正在引用的自定义表格是正确的。它给我的物品是同一张桌子上的另一个成员,但不是正确的。它没有返回null,所以表类名必须是正确的,它也是一个正在很多其他正常运行的地方使用的常量。 – Mutton92

0

试试这个:

int id = parameter.ID; 
string where = "YourIdColumn=" + id; 
string columns = "TheColumnYouWant" 

CustomTableItem provider CustomTableItemProvider.GetItems(customTableClassName,where,null,columns); 

var theTrainingPlan = provider["TheColumnNameOfTheValueWant"]; 

当你创建它基本上成为属性地图,您可以直接按键(或列)名称访问值CustomTableItem。