ASP.Net 带有 DropZone 的 MVC 5 无法将其他参数发送到控制器



好吧,我相信这已经有了答案,但我可以诚实地告诉你,我所尝试的一切都失败了。这是我目前的配置:

Shared_Layout.chtml(页脚下方(

<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
@await RenderSectionAsync("Scripts", required: false)

图像查看

@model NewProductVM
<form id="form2" method="post" enctype="multipart/form-data" data-parsley-validate class="form-horizontal form-label-left">    
<div class="form-group">
<label class="control-label col-md-2" for="first-name">
<span class="required">*</span>
</label>

<input type="hidden" value="@Model.Id" />
<div class="col-md-6" id="dropzone">
<div action="UploadFiles" class="dropzone" id="uploader">
Drop files here or click to upload.<br>
</div>
</div>
</div>
</form>

产品控制器

[HttpPost]
public async Task<IActionResult> UploadFiles(string Id)
{
bool bSuccess = true;            
_ConnectionString = _Configuration.GetConnectionString("StorageConnectionString");
_ContainerName = _Configuration.GetValue<string>("StorageContainerName");
string uploads = Path.Combine(_hostingEnvironment.ContentRootPath, "Uploads");
if (!Directory.Exists(uploads))
Directory.CreateDirectory(uploads);
foreach (var iFormFile in Request.Form.Files)
{
if (iFormFile.Length > 0)
{
if (StorageHelper.IsImage(iFormFile))
{
var filePath = Path.Combine(uploads, iFormFile.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await iFormFile.CopyToAsync(stream);
}
bSuccess = await StorageHelper.UploadFileToStorage(iFormFile, filePath, _ConnectionString, _ContainerName);
System.IO.File.Delete(filePath);
ProductImage productImage = new ProductImage
{
ProductId = int.Parse(Id),
ImageURL = $"{_Configuration.GetValue<string>("StorageContainerURL")}/{iFormFile.FileName}"                            
};
await _imageService.AddNewImageAsync(productImage);                        
}
}
}
return RedirectToAction("Index");
}

我真的很想把整个NewProductVM模型传递给UploadFiles方法,但视图模型中没有太多属性,所以我可以单独传递每个属性。

现在,我接受了一些人的建议,创建一个隐藏的表单字段,并添加一个我想传递给控制器的值作为表单字段,但UploadFiles方法中的参数值为null。我也尝试过使用asp-route-id="@Model.Id"。当我这样做的时候,控制器方法中id的值是0。

有人有什么建议吗?

好吧,我终于找到了答案,我简直不敢相信它有多简单。我已经为此工作了好几个小时了。我在这里找到了答案:https://social.msdn.microsoft.com/Forums/en-US/a87c6936-c0b5-4f47-b074-dbaf4c154cdd/id-parameter-returning-null-after-using-formdataappend-to-append-id-to-model-id-in-mvc-5?forum=aspmvc

这就是我所做的:

Images.cshtml

<form id="form2" method="post" enctype="multipart/form-data" data-parsley-validate class="form-horizontal form-label-left">
<div class="form-group">

<label class="control-label col-md-2" for="first-name">
<span class="required">*</span>
</label>
<div class="col-md-6" id="dropzone">
<div action="UploadFiles?Id=@Model.Id" class="dropzone" id="uploader">
Drop files here or click to upload.<br>
</div>
</div>
</div>
</form>   

产品控制器.cs

[HttpPost]        
public async Task<IActionResult> UploadFiles(int Id)
{
bool bSuccess = true;            
_ConnectionString = _Configuration.GetConnectionString("StorageConnectionString");
_ContainerName = _Configuration.GetValue<string>("StorageContainerName");
//int Id = int.Parse(fc["Id"]);
string uploads = Path.Combine(_hostingEnvironment.ContentRootPath, "Uploads");
if (!Directory.Exists(uploads))
Directory.CreateDirectory(uploads);
foreach (var iFormFile in Request.Form.Files)
{
if (iFormFile.Length > 0)
{
if (StorageHelper.IsImage(iFormFile))
{
var filePath = Path.Combine(uploads, iFormFile.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await iFormFile.CopyToAsync(stream);
}
bSuccess = await StorageHelper.UploadFileToStorage(iFormFile, filePath, _ConnectionString, _ContainerName);
System.IO.File.Delete(filePath);
//ProductImage productImage = new ProductImage
//{
//    ProductId = Id,
//    ImageURL = $"{_Configuration.GetValue<string>("StorageContainerURL")}/{iFormFile.FileName}"          
//};
//await _imageService.AddNewImageAsync(productImage);                        
}
}
}
return RedirectToAction("Index");
}

真正让它发挥作用的部分是action="UploadFiles?Id=@Model.Id"

因此,基本上,我使用该操作将我想要的值传递给我的控制器方法。

最新更新