
ASP.NET MVC初学者教程:一步步构建Web应用
下载需积分: 0 | 4.97MB |
更新于2024-10-19
| 177 浏览量 | 举报
收藏
"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应用程序。
相关推荐













@{
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 type="text/html" id="toolBarTpl">
文件上传
</script>
动作履历表
<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>是否有错误
<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 type="text/html" id="toolBarTpl">
文件上传
</script>
动作履历表





hxworm
- 粉丝: 6
最新资源
- 使用Maple与MATLAB解题方法详解
- KID或IID与SS号转换工具及计算方法
- 基于Authorware的多媒体作品《三山五岳》介绍
- 长江大学数电实验与VHDL技术资料合集
- PLSQL Developer 8.0.2 注册机工具发布
- 数子电路与逻辑设计详尽习题解析
- VxWorks操作系统源代码下载与学习
- ASP.NET实现静态网页生成的实例解析
- Windows平台上实用的Java反编译工具推荐
- 基于C#与SQL2005的家电进销存信息管理系统开发
- 基于C与汇编语言实现的DOS操作系统源码解析
- 免安装的高效二笔输入法,提升汉字输入速度
- Linux内核中断与异常机制解析
- Oracle TNS协议解析源码深入分析
- Machinarium机械迷城最终完美汉化补丁发布
- Java连接Domino技术文档合集与配置指南
- 运算放大器使用指南:单电源应用详解
- MapXtreme for Windows 中文培训教材解析与学习指南
- OpenSSL 编程中文帮助文档 DOC 版详解
- IIS6安装包及完整所需DLL文件整合
- 基于DSP2812的SPWM生成与键盘液晶控制实现
- C语言第十二周CH习题解答与源代码
- Windows Sockets网络开发与Visual C++实现源码解析
- Canvas技术资料合集与PHP框架Yii中文文档详解