You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC文件上传:两行相似BeginForm代码仅一行生效的问题

问题根源与解决办法

这事儿的核心是你误用了Html.BeginForm的重载方法!

先看你的第一行代码:

@using (Html.BeginForm(new { enctype = "multipart/form-data" }))

这个重载接收的参数是路由值对象,不是表单的HTML属性。也就是说,你这里的enctype被当成了路由参数来处理,而不是添加到<form>标签的属性里。你可以去看一下页面的HTML源码,肯定会发现第一个form标签根本没有enctype="multipart/form-data"这个属性——没有这个属性,浏览器就不会以正确的编码格式发送文件,后台自然接收不到附件,只会拿到null。

虽然你说断点能命中Attachments控制器的Create方法,这大概率是路由规则碰巧匹配上了,但表单的编码格式不对,文件上传肯定失败。

再看第二行代码:

@using (Html.BeginForm("Create", "Attachments", FormMethod.Post, new { enctype = "multipart/form-data" }))

这个是用了正确的重载:前两个参数指定action和controller,第三个是请求方法,第四个才是HTML属性对象。所以这里的enctype会被正确渲染到form标签上,浏览器就能以multipart格式发送文件,后台也就正常接收了。

如果想保留“不指定action和controller,用当前路由”的写法,你可以用这个重载:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))

把action和controller设为null,框架会自动使用当前页面的路由信息,同时第四个参数明确传入HTML属性,这样enctype就会被正确设置了。

内容的提问来源于stack exchange,提问作者jarrad_obrien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:55:12