CFWheels:在redirectto而不是renderpage

时间:2016-03-03 03:35:27

标签: coldfusion cfwheels

我有一个表单,我正在验证使用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(),那么错误不会显示?这是为什么?

为了清楚起见,我想将页面发送/重定向到原始格式并显示错误消息,但我不想输入呈现该页面所需的其他变量?有办法吗?

如果您需要更多说明,请与我们联系。

1 个答案:

答案 0 :(得分:3)

这可能看起来有点偏离主题,但我的猜测是这是一个问题,表单使用一个控制器(new)呈现并使用另一个(create)处理或在案例中更新,使用edit使用update句柄表单进行渲染。

我认为,恕我直言等...... cfWheels路线完成的方式还有一些改进空间。您可以在许多框架的路由组件中看到,您可以为POST指定一个不同于GET的控制器功能。使用cfWheels,所有调用都是根据网址处理的,因此如果您使用相同的网址,则GETPOST将由同一个控制器处理(例如,当表单操作留空时)。

这是cfwheels的互动:

cfwheels way of doing it

虽然可以改变它的方式,但您发现的文档和教程似乎更喜欢这种方式。

<强> 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>