Coldfusion CFWheels:在重定向到而不是渲染页上显示表单错误

Coldfusion CFWheels:在重定向到而不是渲染页上显示表单错误,coldfusion,cfwheels,Coldfusion,Cfwheels,我有一个表单,我正在使用CFWheels模型验证和表单帮助程序进行验证 控制器中index()操作/视图的我的代码: public function index() { title = "Home"; forms = model("forms"); allforms = model("forms").findAll(order="id ASC"); } #startFormTag(controller="form", action="init_form")# &

我有一个表单,我正在使用CFWheels模型验证和表单帮助程序进行验证

控制器中index()操作/视图的我的代码:

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()#
从上面的代码中可以看到,我正在验证表单字段的值,如果有任何错误,它将发送到原始索引页。我的问题是,由于我正在呈现页面,我还必须重新键入页面所需的其他变量,如本例中的下拉列表中的“allforms”

有没有办法不输入这样的变量?如果我使用redirectTo()而不是renderPage(),那么不会显示错误?为什么呢

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


如果您需要更多说明,请告诉我。

这似乎有点离题,但我猜这是一个问题,表单使用一个控制器(
new
)呈现,使用另一个控制器(
create
)处理,或者在更新的情况下,使用
edit
渲染,使用
update
处理表单

我会争辩,等等。。。cfWheels路由的完成方式留下了一些改进的空间。您可以看到,在许多不同框架的路由组件中,您可以为
POST
指定不同于
GET
的控制器功能。使用cfWheels,所有调用都是基于url处理的,因此如果您使用相同的url,则
GET
POST
将由相同的控制器处理(如表单操作留空时)

这是cfwheels所做的交互:

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

TL;博士

可用的解决方法是让表单由相同的控制器函数(route)进行渲染(GET:new,edit)和处理(POST:create,update)。在功能中

  • 检查用户是否使用
    POST
    • 如果是
      POST
      ,则运行处理表单的私有函数(即
      handle\u create()
    • handle\u create()
      函数中,您可以设置所有错误检查并创建错误
    • 如果函数没有错误,则创建(或更新)模型并可选地重定向到成功页面
    • 否则返回错误的对象/数组
  • 使结果错误对象/数组可供查看
  • 处理表单创建
在视图中,如果存在错误,请在表单中或顶部某处显示它们。确保表单操作指向self或为空。为submit按钮指定名称和值也有助于确定表单是否已提交

这种“模式”在没有会话的情况下运行得非常好

否则,您可以使用Flash,因为这是它创建的目的,但您确实需要让会话正常工作。它们的用途如下所述:

但这真的很容易添加到您的控制器

    flashInsert(error="This is an error message.");
这符合你的观点

    <cfif flashKeyExists("error")>
        <p class="errorMessage">
            #flash("error")#
        </p>
    </cfif>

#闪光(“错误”)#


为什么不刷新控制盘的消息功能以显示错误消息?如何传递我在模型中定义的自动生成错误?如果我使用flash,那么我必须编写自己的验证代码并传递自己的验证消息。我想使用CFWheels功能生成服务器端错误。但接下来的问题是如何将错误作为参数传递?甚至触发重定向页面上的错误。
    <cfif flashKeyExists("error")>
        <p class="errorMessage">
            #flash("error")#
        </p>
    </cfif>