【问题标题】:Kentico Repeater with Custom Query带有自定义查询的 Kentico 中继器
【发布时间】:2018-12-22 08:00:20
【问题描述】:

好的,我们开始吧。
使用 Kentico 11/Portal 引擎(无热修复)

有一个包含仅内容页面类型的表格。一个重要的字段是日期和时间字段。

我正在尝试从该表中获取与特定月份和年份条件匹配的行。例如,给我Month=2 and Year=2018 的所有记录。这些参数将通过查询字符串传递

我有一个自定义存储过程,我想接收两个 int(或字符串)参数,然后返回所有匹配行的集合。


我正在使用 RepeaterWithCustomQuery 来调用该过程并处理结果行。正如您在下面看到的,查询字符串参数被命名为“year”和“monthnumber”。

查询

Me.PR.PREDetailSelect

在此配置中设置我的 Webpart 时,我收到以下错误:

在我的查询中,我尝试过:

EXEC Proc_Custom_PRDetails @MonthNumber = ##ORDERBY##; @Year = ##WHERE##<br/>
EXEC Proc_Custom_PRDetails @MonthNumber = ##ORDERBY##, @Year = ##WHERE##<br/>
EXEC Proc_Custom_PRDetails @MonthNumber = ##ORDERBY## @Year = ##WHERE##<br/>

任何帮助将不胜感激(在此先感谢 Brendan)。最后,当我试图更改名称以保护无辜者时,不要太拘泥于特定对象的名称。

【问题讨论】:

  • “提前谢谢布伦丹”
  • 查询EXEC Proc_Custom_PRDetails @MonthNumber = ##ORDERBY##, @Year = ##WHERE## 看起来正确,但令人困惑的是错误消息末尾的额外'=1'。你能发布一个查询字符串的例子吗?
  • 确保使用数据转换方法清理中继器属性中使用的宏:docs.kentico.com/k11/macro-expressions/…。否则,您可能会通过将用户控制的数据直接传递到 SQL 查询中来引入 SQL 注入漏洞。

标签: kentico


【解决方案1】:

那些macros for queries 并不意味着与 stor procs 一起使用。如果您不传递任何内容,系统会生成此错误条件 1=1,这样它就不会破坏 sql 语句,如下所示:

SELECT ##TOPN## ##COLUMNS##
FROM View_CMS_Tree_Joined AS V
INNER JOIN CONTENT_MenuItem AS C
ON V.DocumentForeignKeyValue = C.MenuItemID AND V.ClassName = N'CMS.MenuItem'
WHERE ##WHERE##
ORDER BY ##ORDERBY##

您需要将 stor proc 转换为 SQL 语句,然后您可以使用这些 SQL 宏或使用不带参数的 stor proc

如果看上面的查询 topwhere 不好,因为系统会做调整,但是你可以使用 order by 和 列,但它们都必须存在(我认为它按原样传递):

exec proc_test ##ORDERBY##, ##COLUMNS##

老实说,我建议不要这样做,而且调用 stor proc 不会获得太多收益。

【讨论】:

  • 嗯,存储过程背后的整个想法是能够使用 SQL 函数(不确定我是否可以在 Kentico 中使用这些函数,例如 Month() 和 Year())。无论如何,它看起来不像这样有效。评估表达式时出错:QueryString.GetValue("year", 2018) = @Year |(identity)GlobalAdministrator|(hash)ec15e695c31e0bd693eb5ffb9df7a1639ff66ba83d782dd248db1986abf9bbc6
  • 咳咳,请确保您可以在 SQL 中调用您的存储过程:exec proc_test @param1= 1, @param2 = 5 并且它可以工作。
  • 这里有几个截图prntscr.com/k78g9mprntscr.com/k78gmb
  • 感谢彼得,感谢您的帮助。我最终使用了这个:SELECT ##COLUMNS## FROM proc_test WHERE ##WHERE##。我在 Selected columns 过滤器中没有任何参数,但 Where 条件包含:Year(DateTime) = {?year|(default)2018?} AND Month(DateTime) = {?month|(default)7?} AND [已批准]=1。
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多