IIS运行遇System.DateTime参数空值错误,其他环境正常
问题描述
本地Visual Studio及生产环境运行正常,但部署到IIS后出现错误,错误信息如下:
参数字典中为CRMWebApp.Areas.CRM.Controllers.OCController下的InsertOCMain方法的非可空类型参数'ocdate'(System.DateTime类型)包含空条目,可选参数需为引用类型、可空类型或声明为可选参数。
相关代码如下:
后端C#接口代码
[HttpPost] public JsonResult InsertOCMain(List<Stock> ocarrays,string ocno, DateTime ocdate,DateTime cusdate, Guid compid, string prodval, string pf, string total, string igst,string sptaxlabel,decimal sptax, string modeofdespatch, string paymentterms, string grandtotal,string refn,string pino,string cgst, string sgst,string discountprod,decimal spldiscount, string editoption,string couriercharge, string roundoff, string comments) { var isocmainExists = db.OC_Main.Any(x => x.OC_No == ocno); if (isocmainExists) { if (editoption == "yes") { var editoc = db.OC_Main.Where(a => a.OC_No == ocno).FirstOrDefault(); HttpCookie cookie1 = HttpContext.Request.Cookies.Get("Userid"); string organise = cookie1.Value; System.Guid org; org = new Guid(organise); string datestring = ocdate.ToString("dd-MM-yyyy", CultureInfo.InvariantCulture); string custdate = cusdate.ToString("dd-MM-yyyy", CultureInfo.InvariantCulture); } } }
前端AJAX请求代码
var txtocno = $('#txtpno').val(); var ocdate = $('#txtdate').val(); var cusdate = $('#txtcusdate').val(); var compid = c; var prodval = $('#prdval').val(); var pf = $('#pf').val(); var total = $('#total').val(); var igst = ig; var cgst = cg; var sgst = sg; var grandtotal = $('#grdtot').val(); var refn = $('#txtrefno').val(); var pino = $('#Pino option:selected').text(); var discountprod = proddisc; var spldiscount = spldisc; var editoption = editopt; var roundoff = $('#roundoff').val(); var comments = $('#mainterms').val(); var modeofdespatch = $('#txtmodeofdespatch').val(); var paymentterms = $('#txtpaymentterms').val(); if (pf == "") { pf = "0.00"; } $.ajax({ type: "POST", url: "/OC/InsertOCMain", data: JSON.stringify({ ocarrays, ocno: txtocno, ocdate: ocdate, cusdate: cusdate, compid: compid, prodval: prodval, pf: pf, total: total, igst: igst, cgst: cgst, sgst: sgst, sptaxlabel: sptaxlabel, sptax: sptax, modeofdespatch: modeofdespatch, paymentterms: paymentterms, grandtotal: grandtotal, refn: refn, pino: pino, discountprod: discountprod, spldiscount: spldiscount, editoption: editoption, couriercharge: couriercharge, roundoff: roundoff, comments: comments }), contentType: "application/json; charset=utf-8", dataType: "json", });
解决方案
1. 统一日期格式,规避服务器区域解析差异
本地与IIS服务器的区域设置(日期格式规则)可能不一致,导致前端传递的日期字符串无法被服务器解析为DateTime类型,最终出现空值。
- 前端修改:将日期转换为ISO 8601标准格式(如
yyyy-MM-ddTHH:mm:ss)后发送,确保跨环境解析一致:// 处理ocdate var ocdateInput = $('#txtdate').val(); var ocdate = new Date(ocdateInput).toISOString(); // 同理处理cusdate var cusdateInput = $('#txtcusdate').val(); var cusdate = new Date(cusdateInput).toISOString(); - 后端兼容:若前端无法修改,可将参数改为可空
DateTime?,再手动指定格式解析:// 修改参数为可空类型 public JsonResult InsertOCMain(List<Stock> ocarrays,string ocno, DateTime? ocdate, DateTime? cusdate, /* 其他参数 */) { if (!ocdate.HasValue) { return Json(new { success = false, message = "OC日期不能为空" }); } // 若前端传dd-MM-yyyy格式,手动解析 // DateTime parsedOcDate = DateTime.ParseExact(ocdateStr, "dd-MM-yyyy", CultureInfo.InvariantCulture); }
2. 前端添加非空校验
确保日期输入框有有效值后再发送请求,避免空值传递:
// AJAX请求前校验 if (!ocdate || ocdate === "") { alert("请选择OC日期"); return; } if (!cusdate || cusdate === "") { alert("请选择客户日期"); return; }
3. 优化后端参数绑定
当前零散参数接收JSON的方式易出现绑定失败,建议封装ViewModel类并使用[FromBody]特性:
步骤1:创建ViewModel类
public class OCInsertViewModel { public List<Stock> ocarrays { get; set; } public string ocno { get; set; } public DateTime ocdate { get; set; } public DateTime cusdate { get; set; } public Guid compid { get; set; } // 依次添加剩余参数 public string prodval { get; set; } public string pf { get; set; } // ... 其他参数省略 }
步骤2:修改接口方法
[HttpPost] public JsonResult InsertOCMain([FromBody] OCInsertViewModel model) { if (!ModelState.IsValid) { return Json(new { success = false, message = "参数格式错误" }); } // 业务逻辑替换为model属性 var isocmainExists = db.OC_Main.Any(x => x.OC_No == model.ocno); if (isocmainExists) { if (model.editoption == "yes") { var editoc = db.OC_Main.Where(a => a.OC_No == model.ocno).FirstOrDefault(); // ... 剩余逻辑省略 } } }
4. 检查IIS环境配置
- 确认IIS应用程序池的.NET版本与本地开发环境一致;
- 若需固定日期解析规则,可在Web.config中指定全局区域:
<system.web> <globalization culture="en-GB" uiCulture="en-GB" /> <!-- 示例为dd-MM-yyyy格式区域 --> </system.web>
内容的提问来源于stack exchange,提问作者PFA
相关产品推荐
相关产品推荐

