gpt4 book ai didi

asp.net-mvc - 如何将名为 "file[]"的发布数据绑定(bind)到 MVC 模型?

转载 作者:行者123 更新时间:2023-12-04 12:45:04 24 4
gpt4 key购买 nike

我正在使用 Redactor作为一个 HTML 编辑器,它有一个 component for uploading images and files .

Redactor 负责客户端位,我需要提供服务器端上传功能。

如果我使用 Request.Files,让上传工作没有问题在 Controller 中。

但是我想将发布的文件绑定(bind)到模型,我似乎无法做到这一点,因为它们发送的参数是 files[] - 名称中带有方括号。

我的问题:

是否可以绑定(bind)发布的"file[]"到 MVC 模型?这是一个无效的属性名称,使用 file单独是行不通的。

这个文件输入看起来像这样。我可以指定 file 以外的名称,但 Redactor 添加了 []到最后,不管名字。

<input type="file" name="file" multiple="multiple" style="display: none;">

我正在尝试绑定(bind)到这样的属性:
public HttpPostedFileBase[] File { get; set; }

当我观看上传时,我在请求中看到了这一点(我认为编辑器可能会在幕后添加方括号):
Content-Disposition: form-data; name="file[]"; filename="my-image.jpg"

也相关:

Redactor always sends the uploading request with content-type as multipart/form-data. So you don't need to add this enctype anywhere

最佳答案

您应该创建一个自定义模型绑定(bind)器以将上传的文件绑定(bind)到一个属性。
首先使用 HttpPostedFileBase[] 创建一个模型属性(property)

public class RactorModel
{
public HttpPostedFileBase[] Files { get; set; }
}

然后执行 DefaultModelBinder并覆盖 BindProperty
public class RactorModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
int len = controllerContext.HttpContext.Request.Files.AllKeys.Length;

if (len > 0)
{
if (propertyDescriptor.PropertyType == typeof(HttpPostedFileBase[]))
{
string formName = string.Format("{0}[]", propertyDescriptor.Name);
HttpPostedFileBase[] files = new HttpPostedFileBase[len];
for (int i = 0; i < len; i++)
{
files[i] = controllerContext.HttpContext.Request.Files[i];
}

propertyDescriptor.SetValue(bindingContext.Model, files);
return;
}
}

base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}

此外,您应该将 binder 提供程序添加到您的项目中,然后在 global.asax 中注册它
public class RactorModenBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
if (modelType == typeof(RactorModel))
{
return new RactorModelBinder();
}

return null;
}
}
...
ModelBinderProviders.BinderProviders.Insert(0, new RactorModenBinderProvider());

这不是一个通用的解决方案,但我想你明白了。

关于asp.net-mvc - 如何将名为 "file[]"的发布数据绑定(bind)到 MVC 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52183638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com