使用layui中的form表单提交与upload上传

1.首先添加选择图片按钮

<div class="layui-form-item" style="width: 80%">
    <label class="layui-form-label">房间图片</label>
    <h5 id="fileName" style="float: left;margin:0 10px; line-height: 38px;"></h5>
    <button style="float: left;" class="layui-btn" id="preview_img" type="button">
        选择图片
    </button>
</div>

2.添加form表单提交按钮

<div class="layui-form-item" style="width: 80%">
    <div class="layui-input-block">
        <button id="addRoomType" class="layui-btn" lay-submit lay-filter="addRoomType" style="display: none">提交</button>
        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
    </div>
</div>

3.写script语句

layui.use(['layer','form','upload'],function () {
    var layer = layui.layer
        ,form = layui.form
        ,upload = layui.upload;
    var $ = layui.$;
    /*上传图片*/
    upload.render({
        elem: '#preview_img'
        , url: 'addRoomType'
        , size: 1024
        , auto: false //不自动上传
        , choose: function (obj) {
            //预读本地文件
            obj.preview(function (index, file, result) {
                $('#fileName').html(file.name); //展示文件名
            })
        }
        , error: function (index, upload) {
            layer.msg('上传失败!' + index, { icon: 5 });
        }
    });
    //监听提交
    form.on('submit(addRoomType)', function (d) {
        var data = new FormData(document.getElementById("layer_window"));
        $.ajax({
            url: 'addRoomType',
            type: 'POST',
            data: data,
            processData: false,
            contentType: false,
            success: function (r) {
                if (r.code === 200) {
                    location.href = "";
                } else {
                    layer.msg(r.message);
                }
            }
        });
        return false;
    });
});

4.后台接收

@PostMapping("addRoomType")
@ResponseBody
public NingResponse addRoomType(MultipartFile file, RoomType roomType) throws IOException {

    String fileName = file.getOriginalFilename();
    InputStream inputStream = file.getInputStream();
    File uploadFile = new File(this.getClass().getResource("/").getPath() + "/static/static/img/", fileName);
    FileUtils.copyInputStreamToFile(inputStream, uploadFile);
    roomType.setTypeImg("/static/static/img/"+fileName);
    if (this.iRoomTypeService.save(roomType)) {
        return new NingResponse().message("添加成功").success();
    }
    return new NingResponse().message("添加失败").fail();
}
<think>好的,用户想了解如何在Layui中实现表单嵌套。首先,我需要回忆一下Layui的文档和相关知识。Layui是一个前端框架,虽然已经停止维护,但在一些老项目中可能还在使用表单嵌套通常指的是在一个表单内部再嵌套另一个表单,不过根据HTML标准,表单嵌套是不被允许的,可能会导致不可预知的行为,比如只有外层的表单会被提交。 那用户提到的“表单嵌套”可能实际是指结构上的嵌套,比如在表单内部有复杂的布局,比如多个字段组或者分步骤的表单,而并非真正的HTML表单嵌套。这时候应该使用Layui的布局和表单元素组合来实现视觉效果,同时保持单个表单的结构。 接下来,我需要查找Layui的相关组件和示例。引用中的内容提到了常规布局和响应式规则[^3],这可能涉及到使用Layui的栅格系统来布局表单元素。例如,使用layui-row和layui-col-md*来分列布局。此外,文件上传组件[^4]的初始化方法也可能被用到,特别是如果嵌套的表单部分包含文件上传的话。 用户可能需要一个示例代码来展示如何结构上嵌套多个表单区域,但实际上保持在一个表单标签内。需要确保所有表单元素都在同一个<form>标签下,并且提交时能正确收集所有数据。同时,要处理可能的提交事件,使用Layuiform.on('submit')来拦截提交动作,并通过ajax发送数据,包括文件上传的情况,这时需要注意设置processData: false和contentType: false,如引用[2]中提到的[^2]。 可能还需要考虑表单验证,Layui表单验证规则需要在表单元素上添加lay-verify属性,并在JavaScript中定义验证方法。另外,引用[1]提到的样式类,比如layui-layer-lan,可能用于美化表单的弹层提示[^1]。 在编写示例代码时,需要确保结构清晰,使用Layui的栅格布局将表单元素分成多个部分,但所有内容都包含在一个form标签内。提交按钮需要绑定Layui提交事件,使用AJAX来处理数据提交,特别是如果有文件上传的话,要结合upload模块。 最后,生成相关问题时要围绕Layui表单的高级用法、布局优化、验证和文件上传等方面,帮助用户进一步探索相关主题。</think>在 Layui 中实现表单嵌套时,需通过**单表单容器 + 多区域分组**的方式实现视觉效果,而非直接使用嵌套的 `<form>` 标签(HTML 标准禁止嵌套表单)。以下是具体实现方法: --- ### 实现步骤 #### 1. 基础结构 ```html <form class="layui-form" lay-filter="main-form"> <!-- 外层表单区域 --> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" name="username" lay-verify="required" class="layui-input"> </div> </div> <!-- 内嵌“子表单”区域(实际是布局分组) --> <div class="layui-card"> <div class="layui-card-header">附加信息</div> <div class="layui-card-body"> <div class="layui-form-item"> <label class="layui-form-label">邮箱</label> <div class="layui-input-block"> <input type="email" name="email" lay-verify="email" class="layui-input"> </div> </div> </div> </div> <div class="layui-form-item"> <button class="layui-btn" lay-submit lay-filter="form-submit">提交</button> </div> </form> ``` #### 2. 初始化提交 ```javascript layui.use(['form', 'layer'], function(){ const form = layui.form; const layer = layui.layer; // 表单提交监听 form.on('submit(form-submit)', function(data){ // 获取全部表单数据(包含嵌套区域) console.log(data.field); // 模拟Ajax提交(含文件需结合upload模块[^4]) $.ajax({ url: '/submit', method: 'POST', data: data.field, success: function(res){ layer.msg(res.msg); } }); return false; // 阻止默认提交 }); }); ``` --- ### 关键点说明 1. **单表单容器** 所有字段必须包裹在**同一个 `<form>` 标签**内,通过布局组件(如 `layui-card`)实现视觉分组[^3]。 2. **文件上传集成** 若嵌套区域含文件上传,需独立初始化 `upload` 模块: ```javascript upload.render({ elem: '#upload-btn', url: '/upload', done: function(res){ console.log(res.fileUrl); } }); ``` 3. **数据统一提交** 通过 `form.on('submit')` 可自动收集**全表单数据**,包括嵌套区域字段[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值