Spring MVC Ajax 嵌套表单数据的提交

Markdown

概述

在一些场景里,某个大表单里经常嵌套着一个或若干个小逻辑块,好比如下表单里“设计预审”中包括了一个子模块表单“拟定款项”。javascript

Markdown

在这种状况下该怎么去设计实体类以及表单呢?java

实体类的设计

在设计实体类时最好的方式是“主模块包括了本身的字段,而子模块只经过一个属性被引用过来”,以下(如下字段都省略了 getter 和 setter 方法)。ajax

主模块:spring

public class DesignApplyForAuditUpdate extends BaseEntity {
    private String taskId;
    private String taskComment;
 
    private ProjectPaymentItem projectPaymentItem;
}

子模块:json

public class ProjectPaymentItem extends BaseEntity {
 
    // 定金
    private BigDecimal earnestPromotionAmount;
    private BigDecimal earnestPromotionPercentage;
 
    // 首付工程款
    private BigDecimal paymentPercentageFirstPay;
 
    // 水电工程项
    private BigDecimal paymentPercentageShuiDian;
 
}

表单的设计

在子模块元素,能够考虑使用“.”(点)操做符。大概看看主表单和子表单的模样。cookie

主表单:mvc

<td colspan="3">
    <input class="easyui-textbox" type="text" name="taskComment" id="txtTaskComment_Edit"
           data-options=" multiline:true, validType:'length[1,2000]', novalidate:'novalidate', width:435, height:58 "/>
</td>

子表单(内嵌于主表单之中):app

<td colspan="3">
    <span>已交纳</span>
    <input type="text" class="easyui-numberbox" name="projectPaymentItem.earnestPromotionAmount"
           id="txtEarnestPromotionAmount_Edit"
           missingmessage="请确保是有效的数字"
           min="0" max="99000000" precision="2"
           data-options="width:150, required:true, novalidate:'novalidate' "/>
    <span>元,优惠百分比:</span>
    <input type="text" class="easyui-numberbox" name="projectPaymentItem.earnestPromotionPercentage"
           id="txtEarnestPromotionPercentage_Edit"
           missingmessage="请确保是有效的数字"
           min="100" max="10000" precision="0"
           data-options="width:150, required:true, novalidate:'novalidate' "/>
    <span>%</span>
    <div>
        <span>可抵消金额:</span>
        <span id="earnestPromotionResult">5000</span>
        <span>元</span>
    </div>
</td>

能够看到,子模块的 name 属性值前面须要经过点间隔符来补充一个前缀:“projectPaymentItem”ui

通过 Ajax 提交后,服务端会以主子结构无缺的承接客户端的数据。url

Markdown

客户端的 Ajax 和 SpringMVC 控制器

对于表单数据的提交只需采用普通的 Ajax 配置来提交就能够,即便实体模型是嵌套层次。

  • 客户收集数据以及 Ajax
// 表单值获取
var formData = $taskForm.form('r_serialize', false);
 
// 发起请求操做
$.ajax({
    data: formData,
    url: url,
    type: "POST",
    dataType: "json",
    success: function (result) {
        console.info("保存成功,返回的数据为:↓");
        console.info(result);
 
        if (result.success) {
            $.messager.show({
                title: '提示', // 头部面板上显示的标题文本。
                msg: result.message
            });
        }
    },
    error: function (result) {
    }
}); //end ajax

尽管要提交的数据存在嵌套,但这还不属性复杂模型,因此 Ajax 只需按普通数据来提交便可。

看一下提交的数据:

Markdown

  • SpringMVC 控制器接收数据
// 暂存
@RequestMapping(value = "/UpdateDesignApplyForAudit", method = RequestMethod.POST)
@ResponseBody
public TransactionResult UpdateDesignApplyForAudit(DesignApplyForAuditUpdate designApplyForAuditUpdate, @CookieValue(value = "base_cookieKey", required = false) CookieObject cookieObject) {
    designApplyForAuditUpdate.setCookieObject(cookieObject);
    TransactionResult result = null;
}

designApplyForAuditUpdate 的值以下:

Markdown

最后提一下客户端针对子表单的赋值,尽管上述的取值很方便,但赋值仍需逐个进行:

// 拟定款项
projectPaymentItemPartialView.initialForm(result.data.projectPaymentItem);
 
initialForm: function (data) {
    // 定金
    $txtEarnestPromotionAmount_Edit.numberbox('setValue', data.earnestPromotionAmount);
    $txtEarnestPromotionPercentage_Edit.numberbox('setValue', data.earnestPromotionPercentage);

    // 工程款
    $txtPaymentPercentageFirstPay_Edit.numberbox('setValue', data.paymentPercentageFirstPay);
    $txtPaymentPercentageShuiDian_Edit.numberbox('setValue', data.paymentPercentageShuiDian);
    $txtPaymentPercentageWaGong_Edit.numberbox('setValue', data.paymentPercentageWaGong);
    $txtPaymentPercentageMuGong_Edit.numberbox('setValue', data.paymentPercentageMuGong);
    $txtPaymentPercentageYouQi_Edit.numberbox('setValue', data.paymentPercentageYouQi);
    $txtPaymentPercentageFinalPay_Edit.numberbox('setValue', data.paymentPercentageFinalPay);

    // 额外款项
    $txtExtraAmount_Edit.numberbox('setValue', data.extraAmount);
}
相关文章
相关标签/搜索