我和小美的撸码日记(3)之中的一个句话搞定MVC表单页数据绑定与提交

本文通过实际案例探讨了从WebForm转向MVC框架时如何高效处理数据的问题,特别是使用JSON进行前后端数据交换的方法,并提供了自定义函数来简化这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

另外献上在《线体验Demo地址》希望大家也能从中得到一些启示。
地址:http://121.40.148.178:8080/ 、 username:guest,password:123456
QQ技术交流群:239168429


“尼玛哥,你今天有空么?”

“今天周日呀,怎么会没空,你这是要约么?麻辣烫凉皮我都吃,在哪儿,我一会儿就到。”

“约你妹呀,我昨天都加一天班了,东西到如今还没搞完,你给我快点过来呀,我须要你!”

“别急噢,有哥在,这都不叫事儿。”

二十分钟后...

“小美,什么问题搞不定?”

“尼玛哥,MVC这个破东西,一点都不好用,曾经我做毕业设计用WebForm里面拖server控件可方便了。我这两天在做一个订单管理,曾经用server控件,拖完控件以后这样写”

 

private void save()
{

string orderNo=txt_OrderNo.Text.Trim();
string orderDate=txt_OrderDate.text.trim();
... ...
SqlHelper.Execute("Insert Into Order...
... ...


}

“表头数据提交这样写,订单明细更好弄了,直接拖个GridView出来数据就能够绑定上去了。你看界面我昨天上午就弄好了,数据按你曾经说的,组成Json走Ajax提交到后台这一个个拼,到后台再一个个解,再插数据库要把我搞疯了,表头的还好,明细的会把我搞疯掉!!你看这是我仿其他界面拖出来的界面”

 

 

“不错,不错界面如今画得非常不错了,JQgrid用得也非常像那么回事。你提交数据的代码是怎么写的?”

“诺,你看”

    //保存事件
    function SubmitOrderForm() {
function (r) {
            if (r) {
                Loading(true, "正在提交数据...");
                window.setTimeout(function () {
                    var postData = “{["OrderNo:”+$(txt_OrderNo).val()+ ... ...

                   //明细表格里的都不知道怎么写了!!!!!
                    AjaxJson("/ExampleModule/Order/SubmitOrderForm?KeyValue=" + KeyValue, postData, function (data) {
                        tipDialog(data.Message, 3, data.Code);
                        ThisCloseTab();
                    });
                }, 200);
            }
        });
    }

“看起来倒是像这么回事的,订单明细表格里的一样把值取出来拼Json呀怎么不会了?”

“表格里面我也不知道用户填了多少行数据,知道的话我还能够写个for循环。”

“小美,我看你事业线纵深也不怎么样呀,你这脑子怎么还是这么笨呢!你看表格一共同拥有多少行你这样循环去取,不就好了吗?”

“但是你没看到这上面不是有空行么!”

“都说女人胸大无脑,我认为你如今肯定还是没发育,以后肯定比柳岩身材好。有空行,遇到空行你跳出循环不就好了!你这代码这样写也太乱了,就算写完了也easy出异常,我给你个取页面数据的函数,你自己拿去套着用”

/*
自己主动获取页面控件值
*/
function GetWebControls(element) {
    var reVal = "";
    $(element).find('input,select,textarea').each(function (r) {
        var id = $(this).attr('id');
        var value = $(this).val();
        var type = $(this).attr('type');
        switch (type) {
            case "checkbox":
                if ($(this).attr("checked")) {
                    reVal += '"' + id + '"' + ':' + '"1",'
                } else {
                    reVal += '"' + id + '"' + ':' + '"0",'
                }
                break;
            default:
                if (value == "") {
                    value = " ";
                }
                reVal += '"' + id + '"' + ':' + '"' + $.trim(value) + '",'
                break;
        }
    });
    reVal = reVal.substr(0, reVal.length - 1);
    return jQuery.parseJSON('{' + reVal + '}');
}

 “尼玛哥,真看不出来呀,别看你人不怎么样,写出来的代码还真灵活,就这几句话,我刚套到代码里Alert一下,把界面上的控件和值全拼成了Json,我仅仅要在后台把控件名改成字段名,就能够直接调后台方法把Json转成实体,直接插数据库啦。”

 “小美,你真是得了柳岩的病没有柳岩的命呀!你怎么这么蠢呢,前台代码也是你写的,你界面上的控件名跟字段名一致,不就不用转了么,Json提交后台,转实体插数据库一气呵成,直接能够封闭成公用方法了。”

 “有些代码我是用代码生成器生成的呀!”

 “你就不会改下代码生成器么!把生成前台界面上的txt_、select_。。。这些该死的东西拿掉不就好了,无论加控件减控件套这代码的话,一个代码都不用改呀!”

 “恩,也是噢,我先写写看。”

 一小时后... ...

“尼玛哥,好了,那代码真好用我直接封闭到函数库去了,提交后台就一句话。”

“就这么点东西,你还折腾了一小时,你也是个人才。”

“切,我把明细提交,表单提交一起写完了,曾经是我JS用得不熟,事实上JS也跟C#一样,也能够遍历也一样能够对控件赋值取值,一样有对象的概念。我刚刚把明细转成Json后,后台就转List了,批量插入,带事务也方便。页面编辑事实上就是取值相反的操作,那就是从后台取到值,实体转成Json,再把你方法这么一改,就好了”

/*
自己主动给控件赋值
*/
function SetWebControls(data) {
    for (var key in data) {
        var id = $('#' + key);
        var value = $.trim(data[key]).replace(" ", "");
        var type = id.attr('type');
        switch (type) {
            case "checkbox":
                if (value == 1) {
                    id.attr("checked", 'checked');
                } else {
                    id.removeAttr("checked");
                }
                $('input').customInput();
                break;
            default:
                id.val(value);
                break;
        }
    }
}

“把这两个函数封装一下,前台页面要载入数据或者保存数据,一句话就能搞定呀,尼玛哥!这次代码是我写好的,要不要给网友们发一份呀”

“别,你那代码是直接用到项目里的,项目里面有些公司Logo链接什么的,easy让别人误会是搞推广。”

“恩,好的,晚点我有时间的时候,把公司、项目信息全去掉,再来上传源代码。”

另外献上在《线体验Demo地址》希望大家也能从中得到一些启示。


地址:http://121.40.148.178:8080/ 、 username:guest,password:123456


QQ技术交流群:239168429







 

<think>我们正在创建一个情侣主题的网页。根据用户需求,我们需要编写HTML结构并进行CSS美化。参考引用[1]:我们可以按照步骤搭建本地开发环境,创建文件夹,编写HTMLCSS文件。参考引用[2][3]:我们可以加入些情侣相关的元素,比如恋爱计时器、表白动态效果、爱心等。设计思路:1.页面主题:浪漫、温馨的情侣主题,可以使用粉色系等柔的颜色。2.元素:爱心、计时器(显示在起的天数)、情话、照片展示等。3.动态效果:可以使用CSS动画让爱心飘动,或者使用JavaScript实现些交互。步骤:1.创建HTML结构:包括一个容器,用于显示标题、计时器、爱心、情话等。2.使用CSS进行样式美化:设置背景、字体、颜色、布局等。3.添加动态元素:比如使用CSS动画制作飘动的爱心。4.使用JavaScript添加计时器功能:计算从某个日期(比如在起的那天)到现在经过的时间。下面是一个简单的实现示例:HTML结构:-一个div容器,包含:*标题(例如“我们的爱情”)*计时器(显示天数、小时、分钟、秒)*一个爱心图标(可以使用图标字体或CSS绘制)*段情话(可以固定或随机显示)CSS样式:-背景:渐变粉色背景-字体:使用浪漫字体(如手写体)-爱心:使用CSS绘制,并添加动画效果JavaScript:-计算从开始日期到当前日期的时间差,并动态更新计时器。考虑到用户可能需要一个完整的示例,我们将编写一个包含这些元素的HTML文件。注意:由于用户要求美化,我们将尽量使页面美观。代实现如下:</think>下面我将为你创建一个浪漫的情侣主题HTML页面,并提供美化方案: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>我们的爱情故事</title> <style> /* 全局样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: &#39;Segoe UI&#39;, Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #ffafbd, #ffc3a0); min-height: 100vh; color: #5a3e36; overflow-x: hidden; position: relative; } /* 心形背景装饰 */ .heart-bg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; overflow: hidden; } .heart { position: absolute; background: rgba(255, 255, 255, 0.3); transform: rotate(-45deg); animation: float 15s infinite ease-in-out; } .heart:before, .heart:after { content: &#39;&#39;; position: absolute; background: inherit; border-radius: 50%; width: 100%; height: 100%; } .heart:before { top: -50%; left: 0; } .heart:after { top: 0; right: -50%; } /* 容器样式 */ .container { max-width: 1200px; margin: 0 auto; padding: 2rem; } /* 头部样式 */ header { text-align: center; padding: 2rem 0; animation: fadeIn 2s; } .couple-title { font-size: 3.5rem; margin-bottom: 1rem; color: #d44d5c; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); font-family: &#39;Brush Script MT&#39;, cursive; } .subtitle { font-size: 1.5rem; color: #7e4a5c; } /* 计时器样式 */ .timer-container { background: rgba(255, 255, 255, 0.7); border-radius: 20px; padding: 2rem; margin: 2rem 0; text-align: center; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); animation: slideUp 1.5s; } .timer-title { font-size: 2rem; margin-bottom: 1rem; color: #d44d5c; } .timer { display: flex; justify-content: center; gap: 1.5rem; margin-top: 1rem; } .timer-item { background: rgba(212, 77, 92, 0.1); padding: 1rem; border-radius: 15px; min-width: 100px; } .timer-value { font-size: 2.5rem; font-weight: bold; color: #d44d5c; } .timer-label { font-size: 1.2rem; color: #7e4a5c; } /* 照片墙样式 */ .gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; margin: 3rem 0; } .photo { border-radius: 15px; overflow: hidden; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); transition: transform 0.3s, box-shadow 0.3s; aspect-ratio: 1/1; position: relative; } .photo img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s; } .photo:hover { transform: translateY(-10px); box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2); } .photo:hover img { transform: scale(1.05); } /* 留言板样式 */ .message-board { background: rgba(255, 255, 255, 0.7); border-radius: 20px; padding: 2rem; margin: 3rem 0; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); animation: slideUp 1.8s; } .message-title { text-align: center; font-size: 2rem; margin-bottom: 1.5rem; color: #d44d5c; } .message-form textarea { width: 100%; padding: 1rem; border-radius: 15px; border: 2px solid #ffafbd; font-size: 1.1rem; resize: vertical; min-height: 150px; margin-bottom: 1rem; } .submit-btn { background: #d44d5c; color: white; border: none; padding: 0.8rem 2rem; border-radius: 30px; font-size: 1.2rem; cursor: pointer; transition: background 0.3s; display: block; margin: 0 auto; } .submit-btn:hover { background: #b33c4a; } /* 页脚样式 */ footer { text-align: center; padding: 2rem 0; color: #7e4a5c; font-size: 1.1rem; } /* 动画定义 */ @keyframes float { 0%, 100% { transform: translateY(0) rotate(-45deg); } 50% { transform: translateY(-20px) rotate(-50deg); } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { opacity: 0; transform: translateY(50px); } to { opacity: 1; transform: translateY(0); } } /* 响应式设计 */ @media (max-width: 768px) { .couple-title { font-size: 2.5rem; } .timer { flex-wrap: wrap; } .timer-item { min-width: 80px; } } </style> </head> <body> <!-- 动态心形背景 --> <div class="heart-bg" id="heartContainer"></div> <div class="container"> <header> <h1 class="couple-title">❤ 小明 & 小美 ❤</h1> <p class="subtitle">我们的爱情故事</p> </header> <section class="timer-container"> <h2 class="timer-title">我们在起已经</h2> <div class="timer" id="loveTimer"> <div class="timer-item"> <div class="timer-value" id="years">0</div> <div class="timer-label">年</div> </div> <div class="timer-item"> <div class="timer-value" id="months">0</div> <div class="timer-label">月</div> </div> <div class="timer-item"> <div class="timer-value" id="days">0</div> <div class="timer-label">天</div> </div> <div class="timer-item"> <div class="timer-value" id="hours">0</div> <div class="timer-label">小时</div> </div> </div> </section> <section class="gallery"> <!-- 照片墙 - 实际使用时替换为真实照片 --> <div class="photo"> <img src="https://via.placeholder.com/300/ffafbd/ffffff?text=我们的回忆1" alt="美好回忆"> </div> <div class="photo"> <img src="https://via.placeholder.com/300/ffc3a0/ffffff?text=我们的回忆2" alt="美好回忆"> </div> <div class="photo"> <img src="https://via.placeholder.com/300/d44d5c/ffffff?text=我们的回忆3" alt="美好回忆"> </div> <div class="photo"> <img src="https://via.placeholder.com/300/7e4a5c/ffffff?text=我们的回忆4" alt="美好回忆"> </div> </section> <section class="message-board"> <h2 class="message-title">爱的留言板</h2> <form class="message-form"> <textarea placeholder="写下你想说的话..."></textarea> <button type="submit" class="submit-btn">传递心意</button> </form> </section> <footer> <p>❤ 用心记录我们的每天 ❤</p> <p>© 2023 我们的爱情故事</p> </footer> </div> <script> // 创建动态心形背景 function createHearts() { const container = document.getElementById(&#39;heartContainer&#39;); const heartCount = 15; for (let i = 0; i < heartCount; i++) { const heart = document.createElement(&#39;div&#39;); heart.classList.add(&#39;heart&#39;); // 随机大小 (10px - 60px) const size = Math.random() * 50 + 10; heart.style.width = `${size}px`; heart.style.height = `${size}px`; // 随机位置 heart.style.left = `${Math.random() * 100}%`; heart.style.top = `${Math.random() * 100}%`; // 随机动画延迟 heart.style.animationDelay = `${Math.random() * 15}s`; container.appendChild(heart); } } // 更新恋爱计时器 function updateLoveTimer() { // 设置开始日期 (YYYY, MM-1, DD) const startDate = new Date(2022, 4, 20); // 2022年5月20日 const now = new Date(); const diff = now - startDate; // 计算年、月、日、小时 const years = Math.floor(diff / (1000 * 60 * 60 * 24 * 365)); const months = Math.floor((diff % (1000 * 60 * 60 * 24 * 365)) / (1000 * 60 * 60 * 24 * 30)); const days = Math.floor((diff % (1000 * 60 * 60 * 24 * 30)) / (1000 * 60 * 60 * 24)); const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); document.getElementById(&#39;years&#39;).textContent = years; document.getElementById(&#39;months&#39;).textContent = months; document.getElementById(&#39;days&#39;).textContent = days; document.getElementById(&#39;hours&#39;).textContent = hours; } // 表单提交处理 function setupForm() { const form = document.querySelector(&#39;.message-form&#39;); form.addEventListener(&#39;submit&#39;, function(e) { e.preventDefault(); const textarea = this.querySelector(&#39;textarea&#39;); if (textarea.value.trim()) { alert(&#39;留言已发送!❤&#39;); textarea.value = &#39;&#39;; } }); } // 页面加载完成后初始化 window.addEventListener(&#39;DOMContentLoaded&#39;, function() { createHearts(); updateLoveTimer(); setupForm(); // 每秒更新计时器 setInterval(updateLoveTimer, 1000 * 60 * 60); // 每小时更新次 }); </script> </body> </html> ``` ### 设计特点说明 1. **浪漫视觉设计**: - 使用粉红色渐变背景(`#ffafbd` → `#ffc3a0`) - 动态漂浮的心形背景元素 - 圆角设计+柔阴影营造温馨感 - 专为情侣设计的标题字体 2. **核心功能模块**: - **恋爱计时器**:自动计算并显示在起的时间(年/月/天/小时) - **照片墙**:4列响应式网格布局展示甜蜜回忆 - **留言板**:可输入保存甜蜜留言的交互区域 - **动态心形背景**:随机生成漂浮的透明心形 3. **交互体验优化**: - 照片悬停放大效果 - 卡片悬停上浮动效 - 平滑的入场动画 - 响应式设计适配移动设备 4. **技术亮点**: - 纯CSS绘制心形元素 - CSS Grid布局照片墙 - JavaScript实时计算恋爱时长 - 渐变背景+半透明卡片营造层次感 ### 使用指南 1. 将代保存为HTML文件(如`love.html`) 2. 替换计时器的开始日期(在JS部分的`startDate`) 3. 替换照片墙的占位图片为你们的真实照片 4. 自定义情侣名字(在`<h1 class="couple-title">`中) 5. 如需部署到网站,可上传到任意静态托管服务 ### 进阶美化建议 1. 添加背景音乐播放器(需添加`<audio>`元素) 2. 增加纪念日提醒功能 3. 添加情侣待办事项列表 4. 集成地图标记重要地点 5. 添加照片幻灯片放映模式 这个设计采用了温馨浪漫的色彩方案,包含了情侣网页的核心功能元素,同时通过交互动画增强了用户体验。代结构清晰,注释完整,便于进步自定义开发[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值