【问题标题】:Passing two form variables in a single URL在单个 URL 中传递两个表单变量
【发布时间】:2013-07-29 22:17:45
【问题描述】:

我在 abc.cfm 中运行以下表单。

//定义的参数

     <cfparam name="startdate" default="#DateFormat(dateAdd('d',-40,now()), 'yyyy-mm-dd')#">
<cfparam name="enddate" default="#DateFormat(dateAdd('d',-1,now()), 'yyyy-mm-dd')#">






     <cfform format="HTML" action="datedownload.cfm" method="get" >


    <cfformgroup type="horizontal">

      <cfinput type="dateField" name="startdate"  width="100" value="#startdate#">
      <cfinput type="dateField" name="enddate"  width="100" value="#enddate#">
      <cfinput name="submitApply" type="submit" value = "Apply">

        <cfinput type="button" name="download" value="Download" onclick="window.location.href='datedownload.cfm?startdate=#form.startdate#&enddate=#form.enddate#path=http://abc.xyz.com/username/July30/datedownload.cfm'"> 




        </cfformgroup>



        </cfform>

使用 datedownload.cfm 中的以下代码打印一切正常

Startdate: <cfdump var = "#startdate#">
End Date :<cfdump var = "#enddate#">

除此之外,Enddate 正在打印完整路径,如下所示:

Startdate: 2013-06-20 End Date : 2013-07-29path=http://abc.xyz.com/username/July30/datedownload.cfm 

如何删除从路径开始的东西?

【问题讨论】:

  • 停止使用 cfform 和 cfinput。与真正的方式相比,它没有任何优势。还有……什么没用?链接没有如您预期的那样出现?下载.cfm 时出错?细节……我们需要细节。
  • @ScottStroz 感谢您的回复,但是当我在我的 Download.cfm 文件的正文部分替换您的代码时,没有显示任何内容。
  • 那是因为您没有在 download.cfm 中输出任何内容。作为测试,在&lt;/body&gt; 之前添加&lt;cfdump var="#form#" /&gt;,您应该会看到 startdate 和 enddate 值。
  • 您还错误地构建了查询字符串。应该有一个“?”在表示查询字符串开始的路径之后。然后,名称值对应该用“$”分隔。所以你应该有类似..download.cfm?a=123&b=asdf
  • 这应该是一个“&”而不是“$”。

标签: coldfusion coldfusion-8 cfform


【解决方案1】:

如果我没看错,当您尝试加载 download.cfm 时,您会收到一个错误,即 startdate 和 enddate 未在表单范围内定义。由于您将这些变量作为查询字符串的一部分传递给 download.cfm(通过使用 GET 提交表单),因此它们不会出现在表单范围内。

我能想到 2 个快速简便的解决方案:

首先,您可以将form.startdateform.enddate 的引用分别更改为url.formdateurl.enddate。作为查询字符串的一部分传入的变量(例如当您执行 GET 时)成为 url 范围的一部分,而不是表单范围的一部分(当您执行 POST 时)。

其次,您可以在 download.cfm 中像这样对变量进行参数化:

<cfparam name="url.startdate" default="#DateFormat(dateAdd('d',-40,now()), 'yyyy-mm-dd')#">
<cfparam name="url.enddate" default="#DateFormat(dateAdd('d',-1,now()), 'yyyy-mm-dd')#">
<cfparam name="form.startdate" default="#url.startdate#">
<cfparam name="form.enddate" default="#url.enddate#">

这将首先将 url 范围内的值参数化为显示表单的页面中的相同值,然后将表单范围内的相同变量名参数化为相同变量名的相同值网址范围。

【讨论】:

  • 为什么要我在 download.cfm 中重新定义变量?我已经在我创建表单的文件(例如:abc.cfm)中定义了 cfparam 变量。另外,你能检查一下我的查询字符串吗?
  • 这是为了确保如果有人直接点击download.cfm,它不会抛出错误。在一个页面中参数化变量,不会在另一个请求中将它们参数化到另一个页面中。 Dave Ferguson 已经告诉过您查询字符串的外观。
  • 我刚刚更新了我的代码,现在我收到一个不寻常的错误,提示在 FORM 中没有定义 startdate。
  • 将表单的 action 属性(并停止使用 cfform)从 download.cfm 更改为 apply.cfm(或您正在处理表单的任何页面)。由于您使用 onclick 转到 download.cfm,因此无需在“操作”属性中指定。如果我的回答有助于解决主要问题中的问题..请随时“接受”它作为答案。 :D
  • 嗯...
    。您不必仅仅因为使用 ColdFusion 就使用 。作为一个整体开发人员,不使用 cfform 或 ColdFusion 中的任何 UI 内容将使您受益……学习如何真正使用这些东西。
【解决方案2】:

enddate 之前使用 & 符号代替问号,并在 path 变量之前添加 & 符号

window.location.href='Download.cfm?startdate=#form.startdate#&enddate=#form.enddate#&path=http://abc.xyz.com/<username>/Testing/Testing/Download.cfm'

【讨论】:

  • 上述解决方案不起作用。当我尝试显示开始日期时,Download.cfm 页面上仍然出现错误。
  • 我减 1。您正在尝试访问表单变量而不提交表单。
【解决方案3】:

解决问题的最简单方法是去掉第二个按钮。这不是必需的,而且不仅会让您感到困惑,还会让您的用户感到困惑。由于您的表单方法是“获取”,因此两个表单字段将成为您想要的 url 范围的一部分。

另外,两个输入的值属性中的表单变量来自哪里?

【讨论】:

  • 感谢您的回复。删除第二个按钮是什么意思?我需要两个按钮 1) 应用和 2) 下载。我已经更新了代码,它解释了两个输入的值属性中表单变量的来源。
  • 使用单选按钮或下拉菜单让用户决定要做什么。
【解决方案4】:

使用表单帖子有什么问题?这就是我喜欢这样做的方式。我还测试了请求类型(POST 与 GET)以确保下载文件不可收藏。

您需要使用 javascript 来获取基于 Web 的表单中的日期,而不是 ColdFusion。 (用户还需要启用 javascript 才能使用表单来使用 location.href。)

为您的表单字段提供匹配 ID 并尝试以下操作:

window.location.href='Download.cfm?startdate='+ document.getElementById('startdate').value +'&enddate='+ document.getElementById('enddate').value +'&path=http://abc.xyz.com/<username>/Testing/Testing/Download.cfm';

我建议不要使用 CFForm 标签,因为它们需要 /CFIDE/ 目录并且目前建议被阻止:

确保在服务器端执行日期验证。如果您需要客户端日期验证,可以使用 HTML5 DOCType 和属性 type="date" & required 或考虑使用 jQuery Validation plugin(最好是 CFForm 验证)。

【讨论】:

  • 使用您的方法后我仍然收到错误消息:元素 STARTDATE 在 FORM 中未定义。错误发生在 C:\xyz.abc.com\\Testing\Testing\Download.cfm: line 10 ` 8 : 9 : 10 : 您选择的开始日期是:#form。 startdate# 11 : 12 : 您选择的结束日期是:#form.enddate#`
  • FORM 范围变量仅在您使用 FORM“post”时可用,否则所有 URL 参数都在 URL 范围内(即 URL.StartDate 和 URL.EndDate)。关于“服务器端验证”,建议这样做以防止 XXS(跨站点脚本)和 SQL 注入。用户不能验证用户刚刚提交的日期。 &lt;cfparam name="URL.StartDate" type="date"&gt;&lt;cfparam name="URL.EndDate" type="date"&gt;&lt;cfif URL.StartDate GTE URL.EndDate&gt;Invalid Date Range&lt;cfabort&gt;&lt;/cfif&gt;
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多