file-type

ASP.NET MVC初学者教程:一步步构建Web应用

PDF文件

下载需积分: 0 | 4.97MB | 更新于2024-10-19 | 177 浏览量 | 3 下载量 举报 收藏
download 立即下载
"ASP.NET MVC STEP BY STEP 中文版,由张逸编译,内容涵盖了ASP.NET MVC 1.0的逐步学习,包括创建MVC Web应用、模型、控制器、视图、数据库操作、CRUD操作及数据验证等方面。教程通过NerdDinner项目实例进行讲解,帮助读者深入理解ASP.NET MVC框架的使用。" 本文档详细介绍了如何学习和应用ASP.NET MVC框架,主要围绕以下几个关键知识点展开: 1. **创建MVC Web Application**: 首先,介绍如何创建一个新的MVC Web应用程序,这是开发的基础。这通常涉及到在Visual Studio中选择ASP.NET MVC模板并配置项目设置。 2. **检查NerdDinner项目的目录结构**: NerdDinner是用于教学的示例项目,其目录结构展示了MVC项目的一般布局,包括Models、Controllers、Views等关键文件夹。 3. **运行与测试应用程序**: 运行NerdDinner应用程序并进行初步测试,以确保环境配置正确并了解程序的基本功能。 4. **创建数据库与设置外键**: 教程展示了如何创建数据库,以及如何在数据库表之间建立外键关系,这对于实现数据的关联和完整性至关重要。 5. **使用LINQ to SQL**: LINQ是一种在.NET Framework中处理数据的语言集成查询工具,用于简化数据库操作。在这里,它被用来与数据库交互,创建和管理数据模型。 6. **控制器(Controllers)与视图(Views)**: 控制器负责处理用户请求,视图则负责呈现数据。教程演示了如何添加控制器,如DinnersController,并理解ASP.NET MVC的路由机制。此外,还展示了如何在控制器中使用Repository模式,以及如何将数据传递给视图。 7. **视图模板的实现**: 包括NotFound、Details和Index视图的创建,这些都是MVC应用程序中常见的视图类型,用于显示不同的数据或处理不同的用户交互。 8. **创建、更新、删除记录(CRUD)**: 详细解释了如何实现HTTP-GET和HTTP-POST方法来支持创建、编辑和删除记录。这部分涵盖了表单提交、表单辅助方法如Html.BeginForm和Html.TextBox,以及处理异常和验证。 9. **验证和ModelState**: 解释了ModelState的概念,以及如何与HTML辅助方法集成进行数据验证,确保用户输入的数据满足业务规则。 10. **安全性与模型绑定**: 讨论了模型绑定的安全性问题,如基于用途和类型的绑定锁定,以防止不必要的数据注入。 11. **CRUD封装与ViewModel**: 提出了ViewData和ViewModel的概念,它们是用来在控制器和视图之间传递数据的方式,帮助保持代码的整洁和可维护性。 通过以上这些步骤,读者可以系统地学习并掌握ASP.NET MVC框架的基本用法,从而能构建自己的MVC应用程序。

相关推荐

filetype

@{ ViewBag.Title = "ProdResultsProdActualDetail"; Layout = "~/Views/Shared/_Layout.cshtml"; } @Html.AntiForgeryToken()
<label class="layui-form-label" style="width:130px;">产品序列号</label>
<input type="text" id="subLotId" name="subLotId" maxlength="50" autocomplete="off" class="layui-input rd" readonly>
<label class="layui-form-label" style="width:130px;">订单编号</label>
<input type="text" id="orderNo" name="orderNo" maxlength="25" autocomplete="off" class="layui-input rd" readonly>
<label class="layui-form-label" style="width:130px;">产品名称</label>
<input type="text" id="productName" name="productName" maxlength="25" autocomplete="off" class="layui-input rd" readonly>
<label class="layui-form-label" style="width:130px;">产品图号</label>
<input type="text" id="productNo" name="productNo" maxlength="25" autocomplete="off" class="layui-input rd" readonly>
<label class="layui-form-label" style="width:130px;">工艺路线编号</label>
<input type="text" id="processNo" name="processNo" maxlength="25" autocomplete="off" class="layui-input rd" readonly>
<label class="layui-form-label" style="width:130px;">工艺路线版本</label>
<input type="text" id="processVersion" name="processVersion" maxlength="10" autocomplete="off" class="layui-input rd" readonly>
<label class="layui-form-label">工程版本</label>
<input type="text" id="allotStepVersion" name="allotStepVersion" maxlength="10" autocomplete="off" class="layui-input rd" readonly>
工序履历表
工步履历表
步骤履历表
<script> layui.use(['table', 'form','upload'], function () { var layer = layui.layer; var table = layui.table; var upload = layui.upload; var qrySubLotId = '@ViewBag.subLotId'; //工序履历表 table.render({ elem: '#prodHistory' , even: true , autoSort: false , page: false , height: 280 , cols: [[ { field: 'WORKBENCHCODE', title: '作业台编号', width: 120, }, { field: 'WORKBENCHNAME', title: '作业台名称', width: 130, }, { field: 'LOTNO', title: 'Lot号', width: 140 }, { field: 'PROCESSNUM', title: '工序号', width: 80 }, { field: 'PROCESSNAME', title: '工序名称', width: 120}, { field: 'PROCESSTEXTNO', title: '工序文本码', width: 130 }, { field: 'STARTTIME', title: '开始时间', width: 160, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'COMPLETETIME', title: '完成时间', width: 160, templet: function (d) { if (d.COMPLETETIME == "" || d.COMPLETETIME == null) return ""; return d.COMPLETETIME.replace('T', ' '); } }, { field: 'OPERSTARTSTATUS', title: '开工状态', width: 100, templet: function (d) { if (d.OPERSTARTSTATUS == 0) return "未申报"; else return "已申报"; } }, { field: 'OPERSTARTTIME', title: '开工时间', width: 160, templet: function (d) { if (d.OPERSTARTTIME == "" || d.OPERSTARTTIME == null || d.OPERSTARTTIME == "0001-01-01 00:00:00" || d.OPERSTARTTIME == "0001-01-01T00:00:00") return ""; return d.OPERSTARTTIME.replace('T', ' '); } }, { field: 'OPERENDSTATUS', title: '报工状态', width: 120, templet: function (d) { if (d.OPERENDSTATUS == 0) return "未申报"; else return "已申报"; } }, { field: 'OPERENDTIME', title: '报工时间', width: 160, templet: function (d) { if (d.OPERENDTIME == "" || d.OPERENDTIME == null || d.OPERENDTIME == "0001-01-01 00:00:00" || d.OPERENDTIME == "0001-01-01T00:00:00") return ""; return d.OPERENDTIME.replace('T', ' '); } }, { field: 'FORCEFLAG', title: '报工强制标识', width: 120, templet: function (d) { if (d.FORCEFLAG == 0) return ""; else return "强制报工"; } }, ]] , data: [] }); //工步履历表 table.render({ elem: '#workStepHistory' , even: true , autoSort: false , page: false , height: 280 , cols: [[ { field: 'PROCESSWORKNUM', title: '工步号', width: 80 }, { field: 'PROCESSWORKNAME', title: '工步名称', width: 120 }, { field: 'PROCESSWORKNO', title: '工步文本码', width: 130 }, { field: 'STARTTIME', title: '开始时间', width: 160, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'COMPLETETIME', title: '完成时间', width: 160, templet: function (d) { if (d.COMPLETETIME == "" || d.COMPLETETIME == null) return ""; return d.COMPLETETIME.replace('T', ' '); } }, ]], data:[] }); //步骤履历表 table.render({ elem: '#stepHistory' , even: true , autoSort: false , page: false , height: 280 , cols: [[ /* { field: 'LOTNO', title: 'Lot号', width: 120 },*/ { field: 'PROCESSWORKNUM', title: '工步号', width: 100 }, { field: 'STEPSEQ', title: '步骤号', width: 120 }, { field: 'STEPNAME', title: '步骤名称', width: 120 }, { field: 'STEPKIND_NAME', title: '步骤种类', width: 90 }, { field: 'STEPCUMULATIVE', title: '累计时间(秒)', width: 120 }, { field: 'STARTTIME', title: '开始时间', width: 160, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'COMPLETETIME', title: '完成时间', width: 160, templet: function (d) { if (d.COMPLETETIME == "" || d.COMPLETETIME == null) return ""; return d.COMPLETETIME.replace('T', ' '); } }, { field: 'USERCODE', title: '作业员编号', width: 120 }, { field: 'OPERSTARTSTATUS', title: '开工状态', width: 90, templet: function (d) { if (d.OPERSTARTSTATUS == 1) return "已申报"; else return ""; } }, { field: 'OPERSTARTTIME2', title: '开工时间', width: 150, templet: function (d) { if (d.OPERSTARTTIME == "" || d.OPERSTARTTIME == null) return ""; return d.OPERSTARTTIME.replace('T', ' '); }}, { field: 'OPERENDSTATUS', title: '报工状态', width: 120, templet: function (d) { if (d.OPERENDSTATUS == 1) return "已申报"; else return ""; } }, { field: 'OPERENDTIME2', title: '报工时间', width: 150, templet: function (d) { if (d.OPERENDTIME == "" || d.OPERENDTIME == null) return ""; return d.OPERENDTIME.replace('T', ' '); } }, { fixed: 'right', title: '操作', width: 90, align: 'center', toolbar: '#toolBarTpl' }, ]], }); function statusName(d){ if (d == "0") { return "未开始"; } else if (d == "1") { return "OK"; } else if (d == "2") { return "跳步"; } else if (d == "3") { return "暂停"; } else if (d == "4") { return "进行中"; } else if (d == "5") { return "停止"; } else if (d == "6") { return "返工"; } else if (d == "7") { return "手动完成"; } else if (d == "8") { return "请求暂停"; } else if (d == "9") { return "NG"; } else if (d == "10") { return "废弃"; } else { return "未知"; } } //加载步骤动作履历 function loadActionHistory(stepKind, d) { let column = []; //取料 if (stepKind == "0") { column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'ACTIONSTSNAME', title: '动作状态', width: 120, templet: function (d) { return statusName(d.ACTIONSTS); } }, { field: 'STARTTIME', title: '作业时间', width: 200, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'ACTIONVALUE10', title: '物料盒号', width: 120 }, { field: 'ACTIONVALUE11', title: '物料编号', width: 200 }, { field: 'ACTIONVALUE2', title: '取料量', width: 110 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; } //工具 if (stepKind == "1") { column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'ACTIONSTSName', title: '动作状态', width: 110, templet: function (d) { return statusName(d.ACTIONSTS); } }, { field: 'ACTIONVALUE10', title: '螺丝钉编号', width: 100 }, { field: 'STARTTIME', title: '作业时间', width: 200, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'ACTIONVALUE1', title: '理论扭矩最大值', width: 140 }, { field: 'ACTIONVALUE2', title: '理论扭矩最小值', width: 140 }, { field: 'ACTIONVALUE3', title: '实际扭矩值', width: 110 }, { field: 'ACTIONVALUE4', title: '理论角度最大值', width: 140 }, { field: 'ACTIONVALUE5', title: '理论角度最小值', width: 140 }, { field: 'ACTIONVALUE6', title: '实际角度值', width: 110 }, { field: 'ACTIONVALUE7', title: '理论时间最大值', width: 140 }, { field: 'ACTIONVALUE8', title: '理论时间最小值', width: 140 }, { field: 'ACTIONVALUE9', title: '实际时间值', width: 110 }, { field: 'ACTIONVALUE11', title: '程序号', width: 90 }, { field: 'ACTIONVALUE49', title: '制造商序列号', width: 140 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; } //拍照 if (stepKind == "3") { column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'ACTIONSTSName', title: '动作状态', width: 120, templet: function (d) { return statusName(d.ACTIONSTS); } }, { field: 'STARTTIME', title: '作业时间', width: 200, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'ACTIONVALUE7', title: '照片文件名', width: 120 }, { field: 'ACTIONVALUE8', title: 'FTP路径', width: 200 }, { field: 'ACTIONVALUE10', title: '视觉检测位置号', width: 160 }, { field: 'ACTIONVALUE14', title: '视觉检测结果', width: 150 }, { field: 'ACTIONVALUE15', title: '是否复判结果', width: 150 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; } //条码采集 if (stepKind == "5") { column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'ACTIONSTSName', title: '动作状态', width: 120, templet: function (d) { return statusName(d.ACTIONSTS); } }, { field: 'ACTIONVALUE10', title: '采集顺序', width: 120 }, { field: 'STARTTIME', title: '作业时间', width: 200, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'ACTIONVALUE11', title: '物料编号', width: 200 }, { field: 'ACTIONVALUE5', title: '实际采集内容', width: 200 }, { field: 'ACTIONVALUE4', title: '截取后条码号', width: 200 }, { field: 'ACTIONVALUE3', title: '关键件位置号', width: 200 }, { field: 'ACTIONVALUE2', title: '判定结果', width: 200 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; } //检查项 if (stepKind == "7") { column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'ACTIONSTSName', title: '动作状态', width: 120, templet: function (d) { return statusName(d.ACTIONSTS); } }, { field: 'STARTTIME', title: '作业时间', width: 200, templet: function (d) { if (d.STARTTIME == "" || d.STARTTIME == null) return ""; return d.STARTTIME.replace('T', ' '); } }, { field: 'ACTIONVALUE6', title: '检查项结果', width: 400 }, { field: 'ACTIONVALUE7', title: '检查项内容', width: 400 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; } //检测项 if (stepKind == "8") { if(d.length==0 || d[0].HANDEQUIPMENT!=1){ column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'HANDEQUIPMENT_NAME', title: '测试设备区分', width: 120, templet: function (d) { if (d.HANDEQUIPMENT == 1) { return "手动设备"; } else { return "自动设备"; } } }, { field: 'STARTTIME', title: '开始时间', width: 200, templet: function (d) { if (d.START_TIME == "" || d.START_TIME == null) return ""; return d.START_TIME.replace('T', ' '); } }, { field: 'ENDTIME', title: '结束时间', width: 200, templet: function (d) { if (d.END_TIME == "" || d.END_TIME == null) return ""; return d.END_TIME.replace('T', ' '); } }, { field: 'TEST_SEQ', title: '顺序号', width: 90 }, { field: 'PARENT_ITEM', title: '测试父项名称', width: 130 }, { field: 'SUB_ITEM', title: '测试子项名称', width: 120 }, { field: 'STEP', title: '测试项名', width: 110 }, { field: 'RESULT', title: '测试结果(子项)', width: 140 }, { field: 'VALUE_UNIT', title: '测试值单位', width: 120 }, { field: 'VALUE_UNIT_EN', title: '测试值单位2', width: 120 }, { field: 'UPPER_LIMIT', title: '测试值上限', width: 120 }, { field: 'LOWER_LIMIT', title: '测试值下限', width: 120 }, { field: 'RESULT_BOOLE', title: '布尔量测试结果', width: 140 }, { field: 'RESULT_NUMBERIC', title: '数值测试结果', width: 120 }, { field: 'RESULT_STRING', title: '字符串测试结果', width: 140 }, { field: 'PRINT_FLAG', title: '打印标识位', width: 110 }, { field: 'TOOLMNGNO', title: '工具管理编号', width: 130 }, { field: 'TOOLMATNAME', title: '工具名称', width: 130 }, { field: 'MEASUR_PERIOD', title: '校验周期', width: 100 }, { field: 'LAST_MEASUR_TIME', title: '校验时间', width: 120 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; }else{ column = [ { field: 'STEPSEQ', title: '步骤号', width: 110 }, { field: 'HANDEQUIPMENT_NAME', title: '测试设备区分', width: 120, templet: function (d) { if (d.HANDEQUIPMENT == 1) { return "手动设备"; } else { return "自动设备"; } } }, { field: 'STARTTIME', title: '开始时间', width: 200, templet: function (d) { if (d.START_TIME == "" || d.START_TIME == null) return ""; return d.START_TIME.replace('T', ' '); } }, { field: 'ENDTIME', title: '结束时间', width: 200, templet: function (d) { if (d.END_TIME == "" || d.END_TIME == null) return ""; return d.END_TIME.replace('T', ' '); } }, { field: 'TEST_SEQ', title: '顺序号', width: 90 }, { field: 'PARENT_ITEM', title: '检测项目名称', width: 130 }, { field: 'SUB_ITEM', title: '检测项目代号', width: 120 }, { field: 'STEP', title: '检测项目公式', width: 120 }, { field: 'RESULT', title: '测试结果(子项)', width: 140 }, { field: 'VALUE_UNIT', title: '测试值单位', width: 120 }, { field: 'VALUE_UNIT_EN', title: '测试值单位2', width: 120 }, { field: 'UPPER_LIMIT', title: '测试值上限', width: 120 }, { field: 'LOWER_LIMIT', title: '测试值下限', width: 120 }, { field: 'RESULT_BOOLE', title: '布尔量测试结果', width: 140 }, { field: 'RESULT_NUMBERIC', title: '数值测试结果', width: 120 }, { field: 'RESULT_STRING', title: '字符串测试结果', width: 140 }, { field: 'PRINT_FLAG_NAME', title: '打印标识位', width: 110,templete:function(d){ if(d.PRINT_FLAG==1){ return "报表打印"; }else{ return ""; } } }, { field: 'TOOLMNGNO', title: '工具管理编号', width: 130 }, { field: 'TOOLMATNAME', title: '工具名称', width: 130 }, { field: 'MEASUR_PERIOD', title: '校验周期', width: 100 }, { field: 'LAST_MEASUR_TIME', title: '校验时间', width: 120 }, { field: 'USERCODE', title: '作业员编号', width: 160 }, ]; } } //动作履历表 table.render({ elem: '#actionHistory' , even: true , autoSort: false , page: true , height: 300 , cols: [column], data: d }); } //loadActionHistory("1", []); //产品履历信息获取 function initCallBackProdInfoInit(data) { closeLoading(); if (data.success == false) { alertMessage(data.message); return; } let ProdInfo = JSON.parse(data.initData); if (ProdInfo.length > 0) { $("#orderNo").val(ProdInfo[0].ORDERNO); $("#subLotId").val(ProdInfo[0].SUBLOTID); $("#processNo").val(ProdInfo[0].PROCESSNO); $("#processVersion").val(ProdInfo[0].PROCESSVERSION); $("#productNo").val(ProdInfo[0].PRODUCTNO); $("#productName").val(ProdInfo[0].PRODUCTNAME); $("#allotStepVersion").val(ProdInfo[0].ALLOTSTEPVERSION); } let pd = JSON.parse(data.procNumLst); table.reload("prodHistory", { limit: pd.length, data: pd }); } ajaxRequest({ SubLotId: qrySubLotId }, '../prodresults/ProdActualDetailInit', initCallBackProdInfoInit); //工步行信息获取 function initCallBackWorkStepHistory(data) { closeLoading(); if (data.success == false) { alertMessage(data.message); return; } let d = JSON.parse(data.data); table.reload("workStepHistory", { limit: d.length, data: d }); table.reload("stepHistory", { limit: 0, data: [] }); } table.on('row(prodHistory)', function (obj) { loading(); //obj.tr.find('i[class="layui-anim layui-icon"]').trigger("click"); //标注选中样式 obj.tr.addClass('clickRow').siblings().removeClass('clickRow'); var data = obj.data; ajaxRequest({ processNum: data.PROCESSNUM, lotNo: data.LOTNO, subLotId: data.SUBLOTID, operHistoryNo: data.OPERHISTORYNO }, '../prodresults/FindWorkStepHistory', initCallBackWorkStepHistory); }); //步骤行信息获取 function initCallBackStepHistory(data) { closeLoading(); if (data.success == false) { alertMessage(data.message); return; } let d = JSON.parse(data.data); table.reload("stepHistory", { limit: d.length, data: d }); } table.on('row(workStepHistory)', function (obj) { loading(); //obj.tr.find('i[class="layui-anim layui-icon"]').trigger("click"); obj.tr.addClass('clickRow').siblings().removeClass('clickRow'); var data = obj.data; ajaxRequest({ processNum: data.PROCESSNUM, processWorkNum: data.PROCESSWORKNUM, lotNo: data.LOTNO, subLotId: data.SUBLOTID, operHistoryNo: data.OPERHISTORYNO }, '../prodresults/FindStepHistory', initCallBackStepHistory); }); table.on('row(stepHistory)', function (obj) { loading(); obj.tr.addClass('clickRow').siblings().removeClass('clickRow'); let data = obj.data; closeLoading(); ajaxRequest({ sublotId: data.SUBLOTID, factStepId: data.FACTSTEPID, lotNo: data.LOTNO, stepKind: data.STEPKIND }, '../ProdResults/FindStepActionHistory', d => { closeLoading(); if (d.success == true) { //loadActionHistory(data.STEPKIND, d.data); loadActionHistory(data.STEPKIND, d.data); } else { //loadActionHistory(data.STEPKIND, []); loadActionHistory(data.STEPKIND, []); alertMessage(d.message); } }); }); // 监听工具条操作 table.on('tool(lfTable)', function (obj) { var data = obj.data; if (obj.event === 'upload') { document.getElementById('fileInput').click(); // 触发文件选择 } }); function uploadManualInfoFile(uploadPath) { var headers1 = { "__RequestVerificationToken": $("input[name=__RequestVerificationToken]").val(), "Authorization": getAuthToken() }; layui.upload.render({ elem: '#fileInput', url: uploadPath, auto: true, accept: 'file', size: 200 * 1024 * 1024, exts: '*', headers: headers1, choose: function (obj) { }, before: function () { layer.load(2); // 显示加载中 }, done: function (res) { layer.closeAll('loading'); if (res.success) { layer.msg('上传成功'); } else { layer.msg(res.message || '上传失败'); } }, error: function () { layer.closeAll('loading'); layer.msg('上传出错'); } }); } //上传手顺信息文件 uploadManualInfoFile( "tabData", '../ProdActualDetail/UploadManualInfo', "*/*", "file", "*"); }) </script>是否有错误

hxworm
  • 粉丝: 6
上传资源 快速赚钱