gpt4 book ai didi

asp.net-mvc - 在 Bootstrap 模式中使用时,MVC 中的文件上传返回 null

转载 作者:行者123 更新时间:2023-12-02 23:07:31 25 4
gpt4 key购买 nike

我正在尝试将图像上传到我的应用程序,但它始终返回 null。我在这里找不到问题。你能帮我吗?这是我的代码。

型号

<小时/>
[Table("Slider")]
public partial class Slider : BaseModel
{
[Required]
[StringLength(200)]
public string FileName { get; set; }

[StringLength(200)]
public string Title { get; set; }

[StringLength(1000)]
public string Description { get; set; }

public int? Order { get; set; }
}


[NotMapped]
public class SliderImage : Slider
{
public HttpPostedFileBase ImageFile { get; set; }
}

查看

<小时/>
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="modal-body">
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.Id)

<div class="form-group">
@Html.LabelFor(model => model.FileName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.FileName, new { @class = "form-control", @readonly = "readonly" })
@Html.ValidationMessageFor(model => model.FileName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ImageFile, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.ImageFile, new { @class = "form-control", type = "file" })
//This is Same as below
//<input class="form-control" id="ImageFile" name="ImageFile" type="file" value="">
</div>
</div>

Controller

<小时/>
    public ActionResult Edit(int id)
{
Slider slider = _db.Sliders.Find(id);
if (slider == null)
{
return HttpNotFound();
}
Mapper.CreateMap<Slider, SliderImage>();
SliderImage sliderImage = Mapper.Map<Slider, SliderImage>(slider);
return PartialView("_Edit", sliderImage);
}


[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EditSlider([Bind(Include = "Id,FileName,Title,Description,Order,IsActive,Name,ImageFile")] SliderImage sliderImage)
{
if (ModelState.IsValid)
{
Mapper.CreateMap<SliderImage, Slider>();
Slider slider = Mapper.Map<SliderImage, Slider>(sliderImage);
_db.Entry(slider).State = EntityState.Modified;
_db.SaveChanges();
return Json(new { success = true });
}
return PartialView("_EditSlider");
}

我做错了什么?

<小时/>

发现问题

我正在将部分 View 绑定(bind)到 Bootstrap 模式弹出窗口内。当我从弹出窗口上传时,上传返回 null。相反,如果我直接在浏览器中打开部分 View ,则该文件将出现在模型中。所以文件上传是没有问题的。问题出在模态弹出窗口或其他东西上。

使用 Bootstrap 模型时 When Using Bootstrap model

使用部分View Directy时 When using partial View Directy

分别在下图中检查使用fiddler时Bootstrap Modal Submit和直接使用部分 View 之间的差异

Comparison of Fiddler requests

从模式弹出窗口发布时,内容类型更改为 application/x-www-form-urlencoded ,而直接使用部分 View 时,内容类型为 multipart/form-data

<小时/>

找到根本问题。

$('form', dialog).submit(function () {
var $form = $(this);
var enctype = $form.attr('id');
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
if (result.success) {
$('#myModal').modal('hide');
//Refresh
location.reload();
} else {
$('#myModalContent').html(result);
bindForm();
}
}
});
return false;
});

我正在使用 AJAX 发布来提交表单中的数据。当使用 $(this).serialize() 时,ajax 成功被调用,但由于内容类型不同,文件没有返回。我该如何改变这个?

最佳答案

我想我已经能够确定你的问题了,Ajax不支持文件序列化,你应该在脚本中使用以下方法:

$('form', dialog).submit(function () {
var formData = new FormData($(this)[0]);
$.ajax({
url: this.action,
type: this.method,
contentType: this.enctype,
data: formData,
success: function (result) {
if (result.success) {
$('#myModal').modal('hide');
$('#replacetarget').load(result.url); // Load data from the server and place the returned HTML into the matched element
} else {
$('#myModalContent').html(result);
bindForm(dialog);
}
}
});
return false;
});

关于asp.net-mvc - 在 Bootstrap 模式中使用时,MVC 中的文件上传返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563289/

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