ASP.NET MVC 5集成DropZone时无法向控制器传递额外参数问题求助
解决方案
第一步:修正隐藏表单字段的name属性
你当前的隐藏输入框没有指定name属性,表单提交时ASP.NET Core框架无法识别为请求参数,按如下修改:
<!-- 仅传Id的写法 --> <input type="hidden" name="Id" value="@Model.Id" /> <!-- 要传递完整NewProductVM模型的话,按属性名逐个添加对应隐藏字段即可 --> <input type="hidden" name="ProductName" value="@Model.ProductName" /> <input type="hidden" name="Price" value="@Model.Price" /> <!-- 其他属性以此类推 -->
第二步:配置Dropzone携带额外表单参数
Dropzone默认提交文件时不会自动携带外层表单的非文件字段,你需要在Images视图末尾添加Scripts区块配置Dropzone参数:
@section Scripts{ <script> Dropzone.options.uploader = { // 提交文件时自动携带外层form的所有表单字段 params: $('#form2').serializeArray(), // 按需添加上传完成后的回调逻辑 success: function(file, response){ // 若需要上传完成后跳转,可在此处添加页面跳转逻辑 // window.location.href = '/Products/Index'; } }; </script> }
第三步:调整控制器接收逻辑(按需二选一即可)
选项1:单独接收Id参数
保持现有控制器方法签名不变,完成前两步配置后即可正常获取到Id的值。
选项2:直接接收完整NewProductVM模型
修改控制器方法签名,框架会自动匹配提交的字段填充模型:
[HttpPost] public async Task<IActionResult> UploadFiles(NewProductVM model) { // 直接使用model.Id、model.ProductName等属性即可 // 原有上传、存储逻辑保持不变 }
补充说明
你之前使用asp-route-id="@Model.Id"得到0的原因是Dropzone默认不会读取DOM上的asp-route属性作为请求参数,使用上述表单字段+Dropzone参数配置的方案兼容性更高,无需额外适配路由规则。
内容的提问来源于stack exchange,提问作者David.Warwick
相关产品推荐
相关产品推荐

