Как поставить кнопку загрузки файла необязательно в приложениях asp.net c #?

2

У меня есть базовое приложение 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>
}
  • 1
    Ваш файл загружается, но вы не имеете контроля формы для file_one поэтому его всегда null - вы else блок никогда не будет выполнен
  • 0
    @T.C.Я знаю. Я старался избегать путаницы, которая уже присутствует в изобилии. Также, возможно, правильно сказать, что dist ожидает массив из трех двойных в качестве части своего контракта, независимо от того, насколько хорошо этот факт выражен в его подписи.
Показать ещё 8 комментариев
Теги:
button
asp.net-mvc
file-upload

1 ответ

1
Лучший ответ

Точная проблема в том, что вы проверяете значение 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] используется только для моделей данных, чтобы исключить сопоставление сущности со столбцом в базе данных - он не используется в моделях представления, просто удалите его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню