我有一个表单,我正在验证使用CFWheels模型验证和表单助手。
我的索引代码()控制器中的动作/视图:
public function index()
{
title = "Home";
forms = model("forms");
allforms = model("forms").findAll(order="id ASC");
}
#startFormTag(controller="form", action="init_form")#
<select class="form-control">
<option value="">Please select Form</option>
<cfloop query="allforms">
<option value="#allforms.id#">#allforms.name#</option>
</cfloop>
</select>
<input type="text" name="forms[name]" value="#forms.name#">
#errorMessageOn(objectName="forms", property="name")#
<button type="submit">Submit</button>
#endFormTag()#
此表单提交给init_form()操作,代码为:
public function init_form()
{
title = "Home";
forms = get_forms(params.forms);
if(isPost())
{
if(forms.hasErrors())
{
// don't want to retype allforms here ! but index page needs it
allforms = model(tables.forms).findAll(order="id ASC");
renderPage(action="index");
//redirectTo(action="index");
}
}
}
从上面的代码中可以看出,我正在验证表单字段的值,如果有任何错误,则将其发送到原始索引页面。我的问题是,由于我正在渲染页面,我还必须重新键入页面需要的其他变量,例如&#34; allforms&#34;在这种情况下下拉。
有没有办法不输入这些变量?如果我使用redirectTo()代替renderPage(),那么错误不会显示?这是为什么?
为了清楚起见,我想将页面发送/重定向到原始格式并显示错误消息,但我不想输入呈现该页面所需的其他变量?有办法吗?
如果您需要更多说明,请与我们联系。
答案 0 :(得分:3)
这可能看起来有点偏离主题,但我的猜测是这是一个问题,表单使用一个控制器(new
)呈现并使用另一个(create
)处理或在案例中更新,使用edit
使用update
句柄表单进行渲染。
我认为,恕我直言等...... cfWheels路线完成的方式还有一些改进空间。您可以在许多框架的路由组件中看到,您可以为POST
指定一个不同于GET
的控制器功能。使用cfWheels,所有调用都是根据网址处理的,因此如果您使用相同的网址,则GET
和POST
将由同一个控制器处理(例如,当表单操作留空时)。
这是cfwheels的互动:
虽然可以改变它的方式,但您发现的文档和教程似乎更喜欢这种方式。
<强> TL; DR; 强>
可用的解决方法是使表单呈现(GET:new,edit)和处理(POST:create,update)由相同的控制器函数(路由)处理。在函数内......
POST
提交
POST
,请运行处理表单的私有函数(即handle_create()
)handle_create()
函数中,您可以设置所有错误检查并创建错误在视图中,如果存在错误,请在表单中或在某处显示它们。确保表单操作指向self或为空。为提交按钮提供名称和值也有助于确定是否提交了表单。
这种&#34;模式&#34;没有会话就能很好地工作。
否则,您可以使用Flash,因为它是为其创建的,但您确实需要使用Sessions。它们的用法在此处描述:http://docs.cfwheels.org/docs/using-the-flash和此处:http://docs.cfwheels.org/v1.4/docs/flashmessages
但实际上就像将其添加到控制器一样简单
flashInsert(error="This is an error message.");
这是您的观点
<cfif flashKeyExists("error")>
<p class="errorMessage">
#flash("error")#
</p>
</cfif>