У меня есть базовое приложение asp.net С#, в котором есть форма для отправки некоторых данных в базу данных. Эта форма имеет кнопку загрузки для загрузки файла.
Первоначально существовала проблема, заключающаяся в том, что: я не смог отправить форму без загрузки файла, он выдавал ошибку, поскольку [ссылка на объект не установлена для экземпляра объекта], что означает, что загрузка файла была обязательной перед отправкой форма, поэтому, чтобы решить эту проблему, я сделал некоторые изменения в моем контроллере.
Теперь он отправляет форму, даже если я ничего не загружаю, но новая проблема заключается в том, что когда я загружаю файл и отправляю его, он все равно успешно отправляет форму, но не загружает фактический файл.
Это модель:
public class Events
{
public int Id { get; set; }
public string title { get; set; }
public string amount { get; set; }
public string Finance_Approval { get; set; }
public DateTime date_time { get; set; }
public string file_one { get; set; }
[NotMapped]
public HttpPostedFileBase file1 { get; set; }
}
Это контроллер:
public ActionResult Index()
{
return View();
}
public ActionResult Request(Events e)
{
if (e.file_one==null)
{
_context.evt.Add(e);
_context.SaveChanges();
return Content("Added");
}
else
{
string filename = Path.GetFileNameWithoutExtension(e.file1.FileName);
string extension = Path.GetExtension(e.file1.FileName);
filename = filename + DateTime.Now.ToString("yymmssfff") + extension;
e.file_one = "PM_Files/" + filename;
filename = Path.Combine(Server.MapPath("~/PM_Files/"), filename);
e.file1.SaveAs(filename);
_context.evt.Add(e);
_context.SaveChanges();
return Content("Added");
}
}
И это вид бритвы:
@using (Html.BeginForm("Request", "Requester", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-group">
@Html.LabelFor(a => a.title)
@Html.TextBoxFor(a => a.title, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(a => a.amount)
@Html.TextBoxFor(a => a.amount, new { @class = "form-control" })
</div>
<div class="form-group">
<label>Select the file word or pdf etc</label>
<input type="file" name="file1" />
</div>
<button class="btn btn-primary">Request</button>
}
Точная проблема в том, что вы проверяете значение null в строковом свойстве file_one
, которое всегда имеет значение null, поскольку никакой элемент управления формой не связан с ним на странице представления. HttpPostedFileBase
этого вы должны проверить HttpPostedFileBase
:
[HttpPost]
public ActionResult Request(Events e)
{
if (e.file1 != null && e.file1.ContentLength > 0)
{
// save the file
return Content("Added");
}
else
{
// do something else
return Content("Added");
}
}
Если стандартная проверка HttpPostedFileBase
выше, не работает, попробуйте Request.Files
чтобы получить информацию о файле:
[HttpPost]
public ActionResult Request(Events e)
{
if (Request.Files.Count > 0)
{
foreach (string files in Request.Files)
{
if (!string.IsNullOrEmpty(files))
{
// save the file
}
}
return Content("Added");
}
else
{
// do something else
return Content("Added");
}
}
Заметки:
1) Форма использует FormMethod.Post
, поэтому действие контроллера должно использовать [HttpPost]
.
2) [NotMapped]
используется только для моделей данных, чтобы исключить сопоставление сущности со столбцом в базе данных - он не используется в моделях представления, просто удалите его.
file_one
поэтому его всегдаnull
- выelse
блок никогда не будет выполненdist
ожидает массив из трех двойных в качестве части своего контракта, независимо от того, насколько хорошо этот факт выражен в его подписи.