使用ColdFusion提交表单时获取HTML输入标记的类

时间:2014-10-02 16:58:20

标签: html forms coldfusion

首先让我说明我正在尝试做的事情可能不是实现目标的最佳方式,因此任何有关更好方法的建议都会受到赞赏!

我的总体目标:

使用ColdFusion,在提交表单时验证(并在需要时清理)用户输入。我正计划使用jQuery来做同样的事情,以便用户在提交之前可以看到他们的输入是否有任何问题,但我不愿单独依赖jQuery,因为用户可能禁用了JavaScript。

我的当前策略:当用户提交表单时,让ColdFusion循环遍历所有输入并获取每个输入的“class”属性。根据其类别(例如,“text”,“int”等),相应地验证用户的输入。

我的问题:使用ColdFusion是否有一种“简单”的方法来获取HTML属性?

备注:

  • 我正在运行ColdFusion 9
  • 在做一些搜索时,我读过几个人在谈论jTidy和jsoup,但他们似乎对我正在尝试做的事情有点过分了?

同样,对于任何可以实现我想要做的事情的替代方法,我都是耳朵!

2 个答案:

答案 0 :(得分:1)

Cold Fusion无法直接*获得输入类。

间接方法(这些与Cold Fusion无关,只需加载表单以提交更多数据) 您可以使用隐藏字段并执行“fname = string,age = int,lname = string”或单独的隐藏字段,例如name =“data_fname”value =“string”。

(当然,您可以使用javascript / jquery来构建这样一个隐藏的表单变量或变量集,但这会否定第二个可靠的防线的全部要点。

但是这一切都很愚蠢,因为如果你要这样做,只要在处理页面上做一些cfset就更合理了,如果这是你想要设置验证的方式。提交的数据较少,干扰这些变量值的可能性为0.

<cfset dtypes = StructNew()>
<cfset dtypes["fname"] = "string">
<cfset dtypes["lname"] = "string">
<cfset dtypes["age"] = "int">

然后,如果你以相同的方式命名表单变量,那么这很容易匹配,如果你想这样做的话。

<cfloop list="#form.fieldnames#" index="fn">
  <cfif StructKeyExists(dtypes,fn)>
    Data type for this form field found, do some matching.
  <cfelseif listfind("field,names,you,don't,want,to,validate,in,comma,delimited,list",fn)>
    Found a field that doesn't need to be validated, like the submit button.
  <cfelse>
    Field #fn# is not exempt from validation, but no datatype was found.
  </cfif>
</cfloop>

或者你可以说..

<cfloop list="#form.fieldnames#" index="fn">
  <cfif StructKeyExists(dtypes,fn)>
    Data type for this form field found, do some matching.
  <cfelse>
    Field #fn# has no datatype listed, so no validation is performed.
  </cfif>
</cfloop>

您可以更进一步说出

<cfoutput><cfset dtypes = StructNew()>
<cfset dtypes["fname"] = "string">
<cfset dtypes["lname"] = "string">
<cfset dtypes["age"] = "int">

<cfset ErrStruct = StructNew()>
<cfset ErrCount = 0>

<cfloop list="#form.fieldnames#" index="fn">
  <cfif StructKeyExists(dtypes,fn)>
    <cfif dtypes[fn] is "string">
      <cfif if_string_validation_fails>
        <cfset ErrStruct[fn] = "#fn# has a bad value.">
        <cfset ErrCount = ErrCount + 1>
      </cfif>
    <cfelseif dtypes[fn] is "int">
      <cfif if_int_validation_fails>
        <cfset ErrStruct[fn] = "#fn# has a bad value for an int.">
        <cfset ErrCount = ErrCount + 1>
      </cfif>
    </cfif>
  <cfelseif listfind("field,names,you,don't,want,to,validate,in,comma,delimited,list",fn)>
    Found a field that doesn't need to be validated, like the submit button.
  <cfelse>
    Field #fn# is not exempt from validation, but no datatype was found.
  </cfif>
</cfloop>

<cfif ErrCount gt 0>
  <cfloop list="#StructKeyList(ErrStruct)#" index="en">
    Field "#en#" failed: #ErrStruct[en]#.
  </cfloop>
<cfelse>
  Can input form submission stuff here.
</cfif></cfoutput>

if_string_validation_failsif_int_validation_fails已完全组成,没有任何意义,您可以在这里放置验证规则。

答案 1 :(得分:0)

我认为担心禁用JS的浏览器上的用户比例很小可能是最不关心的,但当然不知道网站的目的,我不会做出这样的假设。这是一篇阅读文章,以确定您是否真正需要关注的是:https://webmasters.stackexchange.com/questions/4733/should-i-worry-about-people-disabling-javascript

一旦你确定它是否真的需要担心,你可以继续前进并依赖jQuery,可选择使用某种方法进行优雅降级(例如,要求它们为你的功能启用JS)。

<cfif listLen(structKeyList(form)) GT 0>
    <cfset stcMetadata = deserializeJSON(form._metadata) />
    <cfdump var="#stcMetadata#" />
</cfif>

<html>
<body>
    <form id="myform" method="post">
        name: <input name="name" type="text" class="string" /><br />
        options: 
            <select name="options" class="int">
                <option value="1">1</option>
                <option value="2">2</option>
            </select><br />
        big text: <textarea name="bigtext" class="string"></textarea><br />
        <input type="submit" />
    </form>
</body>
    <script type="text/javascript" src="/path/to/jquery-1.8.3.min.js"></script>
    <script>
    $("#myform").submit(function (e) {
        var $this = $(this),
            fields, metadata = {};

        // Get all the form fields
        fields = $this.find(":input");

        // Loop the fields and compile metadata
        fields.each(function () {
            if (this.type !== "submit") {
                metadata[this.name] = $(this).attr("class") || "";
            }
        });

        // Append the field to your form
        $this.append(
            $("<input type='hidden' name='_metadata' />").val(JSON.stringify(metadata))
        );
    });
    </script>
</html>

你的结果:

struct

bigtext: string
name: string
options: int