MVC中Edit方法lineNumber参数为空报错求助
ASP.NET MVC表单提交报错:非可空参数'lineNumber'为空的解决方法
报错信息
参数字典中包含非可空类型System.Int32的参数'lineNumber'的空条目,该参数属于OrderApplicationXML.Controllers.OrderHeaderController中的System.Web.Mvc.ActionResult Edit(Int32)方法。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称: parameters。
问题原因
- 重复的POST控制器方法:你定义了两个带
[HttpPost]标记的Edit方法,一个接收OrderLine对象,另一个接收int lineNumber。ASP.NET MVC无法区分这两个方法,表单提交时框架可能错误匹配到需要lineNumber的方法,但表单未传递该参数,触发报错。 - 表单缺少必填参数:模型中的
LineNumber是非空int类型,但部分视图未将其作为表单数据提交,导致模型绑定失败,间接引发路由匹配错误。
解决步骤
1. 删除重复的POST方法
直接移除控制器中这个冗余的POST方法:
[HttpPost] public ActionResult Edit(int lineNumber) { OrderLine orderLine = GetOrderLineByLineNumber(lineNumber); if (orderLine == null) { return HttpNotFound(); } return View(orderLine); }
保留接收OrderLine对象的POST方法即可,表单提交的是整个模型数据,不需要单独的lineNumber参数方法。
2. 在视图中添加LineNumber隐藏字段
所有提交OrderLine的视图,都要添加LineNumber的隐藏字段,确保表单提交时携带该参数:
@model OrderApplicationXML.Models.OrderLine @using (Html.BeginForm("Edit", "OrderHeader", FormMethod.Post)) { @Html.HiddenFor(model => model.OrderId) @Html.HiddenFor(model => model.LineNumber) <!-- 新增隐藏字段 --> <div class="form-group"> @Html.LabelFor(model => model.ProductCode) @Html.TextBoxFor(model => model.ProductCode, new { @class = "form-control" }) </div> <!-- 其他表单字段(ProductType、CostPrice等)保持不变 --> <button type="submit" class="btn btn-primary">Update</button> }
这样表单提交时,LineNumber会随表单数据一起发送,模型绑定能正确填充OrderLine对象的属性。
3. 确认路由顺序
确保自定义路由OrderLineEdit在默认路由之前定义,避免默认路由优先匹配:
// 自定义路由放在前面 routes.MapRoute( name: "OrderLineEdit", url: "OrderLine/Edit/{lineNumber}", defaults: new { controller = "OrderHeader", action = "Edit" } ); // 默认路由放在后面 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
这样GET请求OrderLine/Edit/123会正确匹配到GET版本的Edit(int lineNumber)方法,返回带有效LineNumber的模型。
4. 验证GET方法返回的模型
检查GetOrderLineByLineNumber方法,确保它能正确从数据库查询到OrderLine对象,且LineNumber字段不为空。如果查询结果为null,GET方法会返回HttpNotFound,避免视图渲染时出现Model为null的情况。
内容的提问来源于stack exchange,提问作者The01800
相关产品推荐
相关产品推荐

