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
相关产品推荐
相关产品推荐

