При загрузке файла эти две строки кода выглядят одинаково, но работает только одна из них - PullRequest
0 голосов
/ 27 апреля 2018

Я попытался написать две следующие строки в моем представлении, чтобы загрузить файл.

@using (Html.BeginForm(new { enctype = "multipart/form-data" })) 

& застенчивая;

@using (Html.BeginForm("Create", "Attachments", FormMethod.Post, new { enctype = "multipart/form-data" })) 

Обе строки кода POST для действия Create на контроллере Attachments, показанные обеими линиями, достигающими точки останова, которую я установил внутри Create. Однако только вторая строка правильно загружает вложение. В первой строке вложение установлено на null.

Почему первая строка не загружает файл, хотя он также выполняет POST в Create в Attachments?


Вид:

@using (Html.BeginForm(new { enctype = "multipart/form-data" })) 
{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Attachment</h4>

    <div class="form-group">
        @Html.LabelFor(model => model.File, htmlAttributes: new { @class = "control-label col-md-4" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.File, htmlAttributes: new { @class = "form-control", type = "file", name = "file"})
            @Html.ValidationMessageFor(model => model.File, "", new { @class = "text-danger" })
        </div>
    </div>


    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>

</div>
}

Контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "AttachmentID,AttachmentName")] Attachment attachment, HttpPostedFileBase file)
{
    if (ModelState.IsValid)
    {
        db.Attachments.Add(attachment);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(attachment);
}

1 Ответ

0 голосов
/ 27 апреля 2018

Для загрузки файла элементу <form> необходим атрибут enctype = "multipart/form-data".

При первой попытке вы используете эту перегрузку , которая добавляет значение маршрута, и при условии, что метод GET является методом Create() для AttachmentsController, вы генерируете

<form action="/Attachments/Create?enctype=multipart/form-data" method="post">

и атрибута enctype нет, поэтому параметр HttpPostedFileBase file равен null.

Вторая попытка использует эту перегрузку , где четвертый аргумент - htmlAttributes и генерирует

<form action="/Attachments/Create" method="post" enctype="multipart/form-data">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...