首先让我说明我正在尝试做的事情可能不是实现目标的最佳方式,因此任何有关更好方法的建议都会受到赞赏!
使用ColdFusion,在提交表单时验证(并在需要时清理)用户输入。我正计划使用jQuery来做同样的事情,以便用户在提交之前可以看到他们的输入是否有任何问题,但我不愿单独依赖jQuery,因为用户可能禁用了JavaScript。
我的当前策略:当用户提交表单时,让ColdFusion循环遍历所有输入并获取每个输入的“class”属性。根据其类别(例如,“text”,“int”等),相应地验证用户的输入。
我的问题:使用ColdFusion是否有一种“简单”的方法来获取HTML属性?
备注:
同样,对于任何可以实现我想要做的事情的替代方法,我都是耳朵!
答案 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_fails
和if_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