gpt4 book ai didi

grails - 使用复合 key 进行Grails验证

转载 作者:行者123 更新时间:2023-12-02 16:00:30 25 4
gpt4 key购买 nike

我遇到了一个复杂的场景,其中我们使用带有复合键的旧数据库,并且客户端希望能够更改两个数据库pk,即“expenseDate”和“adjustmentNumber”。为了能够更改pk,我必须使用HQL查询。当然,现在这又引起了一系列验证问题。我的解决方法是填充域,以便可以对其进行验证。

到目前为止,一切正常,直到出现我想返回到UI的验证错误。

我有以下URL,它使用recoveryDetail Controller 和edit Action 来呈现页面。

http://localhost:8080/pisr/recoveryDetail/edit?division=ALBANY&peid=PI0003&orgkey=14046701&expenseDate=07-22-2015&adjustmentNumber=1

编辑操作
def edit() {
//Parse clean url expense date
params.expenseDate = new SimpleDateFormat('MM-dd-yyyy').parse(params.expenseDate)

def recoveryDetailInstance = RecoveryDetail.get(new RecoveryDetail(params))

if(recoveryDetailInstance == null) {
redirect(uri:'/')
return
}

[recoveryDetailInstance: recoveryDetailInstance, disabled: isdisabled(recoveryDetailInstance.batchOverride)]
}

以及以下更新 Action 。

更新操作
@Transactional
def update() {
params.pk_expenseDate = getDateParser(params.pk_expenseDate)
params.expenseDate = getDateParser(params.expenseDate)
params.adjustmentNumber = getAdjustementNumber(params)

RecoveryDetail recoveryDetailInstance = new RecoveryDetail(params);
recoveryDetailInstance.division = params.pk_division
recoveryDetailInstance.peid = params.pk_peid
recoveryDetailInstance.orgkey = params.pk_orgkey

recoveryDetailInstance .validate()

if(recoveryDetailInstance .hasErrors()) {
flash.message = "test"
respond view: "edit", model:[recoveryDetailInstance:recoveryDetailInstance]
return
} else {
def sqlParams = [
pk_division:params.pk_division,
pk_peid:params.pk_peid,
pk_orgkey:params.pk_orgkey,
pk_expenseDate:params.pk_expenseDate,
pk_adjustmentNumber:params.int('pk_adjustmentNumber'),
approved:YesNoTypes.valueOf(params.approved),
batchOverride:YesNoTypes.valueOf(params.batchOverride),
adjustmentFlag:params.adjustmentFlag,
adjustmentNumber:params.adjustmentNumber,
projectHours:new BigDecimal(params.projectHours),
percentEffort:new BigDecimal(params.percentEffort),
totalHours:new BigDecimal(params.totalHours),
expenseDate:params.expenseDate
]

RecoveryDetail.executeUpdate(recoveryDetailQuery, sqlParams)
}

编辑gsp
            <g:form class="form-horizontal" url="[resource:recoveryDetailInstance, action:'update']" method="PUT">
<!-- hidden fields contain params from url (composite key)-->
<g:hiddenField name="pk_division" value="${recoveryDetailInstance?.division}"/>
<g:hiddenField name="pk_peid" value="${recoveryDetailInstance?.peid}"/>
<g:hiddenField name="pk_orgkey" value="${recoveryDetailInstance?.orgkey}"/>
<g:hiddenField name="pk_expenseDate" value="${formatDate(format:'MM/dd/yyyy',date:recoveryDetailInstance?.expenseDate)}" />
<g:hiddenField name="pk_adjustmentNumber" value="${recoveryDetailInstance?.adjustmentNumber}"/>

<div class="row">
<div class="col-md-6">
<g:render template="form" model="[recoveryDetailInstance: recoveryDetailInstance, 'mode':'edit']"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<g:actionSubmit class="btn btn-primary" action="update" disabled="${disabled}" value="${message(code: 'default.button.update.label', default: 'Update')}"/>
</div>
</div>
</g:form>

问题
当用户导致触发服务器端响应的验证错误时,我遇到以下具有不同返回类型的问题。

redirect -返回Flash消息,但是将gsp重定向到edit操作,这将触发初始化查询并用原始数据替换所有表单数据。

范例-
redirect (controller:"recoveryDetail", action:"edit", params:["division":params.pk_division, "peid":params.pk_peid, "orgkey": params.pk_orgkey, "expenseDate":params.expenseDate.format("MM-dd-yyyy"), "adjustmentNumber":params.adjustmentNumber])

响应-所以我认为我只需要使用响应,那么结果如下。

URL已更改为 http://localhost:8080/pisr/recoveryDetail/update并删除了所有参数,并返回了404页。


flash.message = "test"
respond view: "edit", model:[recoverDetailInstance:recoverDetailInstance]
return

所以我的问题

如何抛出服务器端验证错误,并将其返回给用户输入数据的页面?

最佳答案

您可以将参数重新添加到重定向或渲染调用中。

redirect (..., params: params)

https://grails.github.io/grails-doc/latest/ref/Controllers/redirect.html

另外,我建议使用服务而不是 Controller 方法。服务已经是事务性的。如果 hasErrors为true,我也会抛出异常。异常消息或对象可以是返回给用户的有效负载。

关于grails - 使用复合 key 进行Grails验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31612469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com