ASP.NET MVC上传JSON文件时Controller接收的参数始终为null如何解决
问题排查及解决方案
核心问题1:表单元素未放在Form块内
你当前的代码结构中,Html.BeginForm对应的{ }块为空,所有文件上传控件、提交按钮都写在表单标签外部,提交操作只会携带表单块内部的元素内容,外部控件的内容不会被提交到后端,导致参数为空。
修改方式:将所有需要提交的元素全部放入@using (Html.BeginForm()){ }的花括号内部。
核心问题2:Html.BeginForm重载使用错误,enctype属性未生效
你当前调用Html.BeginForm的参数传递逻辑错误,你把htmlAttributes配置放到了routeValues的参数位置,导致表单最终没有渲染enctype="multipart/form-data"这个文件上传必须的属性,浏览器不会按文件上传的格式提交数据。
正确的表单写法如下:
@using (Html.BeginForm("Create", "你的实际控制器名称", FormMethod.Post, new { enctype = "multipart/form-data" })) { <h3>OR</h3><br> @Html.TextBox("jsonFile", null, new { type = "file" }) <div class="col-md-offset-2 col-md-10 "> <input type="submit" value="Create" class="btn btn-default submit-button" /> </div> }
其他优化与注意事项
- 你当前后端的
HttpPostedFileBase参数名jsonFile和前端文件输入框的name属性完全匹配,这部分无需修改 - 不要在ASP.NET MVC控制器中使用
MessageBox.Show,这是WinForm的桌面端API,在Web服务端运行会抛出异常,建议改用日志记录、返回前端提示信息的方式做状态反馈 - 读取JSON文件内容时建议使用
ReadToEnd()代替ReadLine(),避免JSON内容存在换行时只读取到部分内容,示例代码如下:
if (jsonFile != null && jsonFile.ContentLength > 0) { using (StreamReader jsonReader = new StreamReader(jsonFile.InputStream, Encoding.UTF8)) { string fullJsonContent = jsonReader.ReadToEnd(); // 后续业务处理逻辑 } }
内容的提问来源于stack exchange,提问作者Rohit Patil
相关产品推荐
相关产品推荐

