2016-03-03 25 views
1

我有一个表单,我正在验证使用CFWheels模型验证和表单助手。CFWheels:在redirectto而不是渲染页面上显示表单错误

我的索引()动作/视图在控制器代码:

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"); 
     } 
    } 
} 

你可以从看上面的代码我验证表单字段的值,如果有任何错误发送到原始索引页面。我的问题是,因为我正在渲染页面,所以我还必须重新输入页面所需的其他变量,例如在这种情况下的“allforms”下拉菜单。

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

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

如果您需要更多说明,请让我知道。

+0

你为什么不车轮的闪光信息功能显示错误信息 –

+0

如何传递我在模型中定义的自动生成错误?如果我使用flash,那么我必须编写自己的验证代码并传递我自己的验证消息。我想使用CFWheels功能来生成服务器端错误。但接下来的事情是如何将错误作为参数传递?甚至在重定向的页面上触发错误。 –

回答

3

这似乎有点偏离主题,但我的猜测是,这是形式的问题,使用一个控制器控制(new)渲染和利用处理其他(create)或更新的情况下,渲染使用edit手柄表格使用update

我会争论,恕我直言,等等...... cfWheels路线完成的方式留下了一些改进的余地。在许多不同框架的路由组件中,您可以看到POST的控制器功能与GET不同。使用cfWheels,所有的调用都是基于url处理的,所以如果你使用相同的URL(比如当表单动作留空时),那么GETPOST将由相同的控制器处理。

这是cfwheels互动做的:

cfwheels way of doing it

虽然有可能改变它的方式,将文档和教程,你会发现似乎更喜欢做的这种方式。

TL; DR;

可用的解决方法是让窗体呈现(GET:新建,编辑)和处理(POST:创建,更新)由同一个控制器函数(路由)处理。在函数...

  • 如果是POST,运行一个私有功能检查,如果用户提交的使用POST
    • (即handle_create())处理该handle_create()功能,你可以设置你所有的错误检查和创建错误
    • 如果函数没有错误,创建(或更新)的模型和可选重定向到
    • 成功页面内的形式
    • 否则返回错误的目的/阵列
  • 使可用的结果误差对象/阵列,以查看
  • 处理表单创建

在视图中,如果存在错误,请将它们显示在窗体中或顶部某处。确保表单操作指向自己或者是空的。给提交按钮一个名称和值也可以帮助确定一个表单是否被提交。

这个“模式”在没有会话的情况下工作得很好。

否则,您可以使用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> 
相关问题