Як написати "Html.BeginForm" у Razor


133

Якщо я пишу так:

form action = "Зображення" метод = "повідомлення" enctype = "багаточастинні / форми-дані"

це працює.

Але в Razor з "@" це не працює. Чи я помилявся?

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

    <fieldset>

        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />

    </fieldset>
}

Мій контролер виглядає так:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload() 
{
    foreach (string file in Request.Files)
    {
        var uploadedFile = Request.Files[file];
        uploadedFile.SaveAs(Server.MapPath("~/content/pics") + 
                                      Path.GetFileName(uploadedFile.FileName));
    }

    return RedirectToAction ("Upload");
}

Дія насправді є "зображеннями" чи це "Завантажити / Завантажити"?
Дж. Стін

насправді у мене є два контролери. контролер зображення з дією "зображення" .. і контролер завантаження "з дією завантаження ..
kk-dev11

Відповіді:


200

Наступний код працює добре:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
}

і генерує, як очікувалося:

<form action="/Upload/Upload" enctype="multipart/form-data" method="post">    
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
</form>

З іншого боку, якщо ви пишете цей код всередині контексту іншої конструкції на стороні сервера, такої як ifабо, foreachви повинні видалити @до using. Наприклад:

@if (SomeCondition)
{
    using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        <fieldset>
            Select a file <input type="file" name="file" />
            <input type="submit" value="Upload" />
        </fieldset>
    }
}

Що стосується коду вашого сервера, ось як діяти :

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file) 
{
    if (file != null && file.ContentLength > 0) 
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/content/pics"), fileName);
        file.SaveAs(path);
    }
    return RedirectToAction("Upload");
}

1
Дякую. Подивіться на контролер, який я оновив у своєму запитанні. Він не працює з кодом Razor ..
kk-dev11

2
@ user1076915, що це не означає ? Не могли б ви бути трохи більш конкретними. Я оновив свою відповідь зразковим кодом того, як може виглядати ваша дія контролера. Якщо ви не можете отримати завантажений файл під час дії контролера, це може означати, що ви вклали <form>теги (що не дозволено в HTML), або ви можете використовувати якийсь JavaScript, який захоплює звичайну форму подання та робить запит AJAX, який не ' не працювати з завантаженнями файлів.
Дарин Димитров

Я використав вашу дію контролера та бритву "@using" .. але вона відображає -> Опис: HTTP 404. Ресурс, який ви шукаєте (або одну з його залежностей), можна було б видалити, змінивши його ім'я або тимчасово недоступний. Перегляньте наступну URL-адресу та переконайтесь, що вона написана правильно.
kk-dev11

@ user1076915, коли ви отримуєте це повідомлення про помилку? Коли ви хочете надати форму для завантаження або коли ви надсилаєте форму? У першому випадку необхідно переконатися , що у вас є GETвивантажувати , які будуть служити Upload.cshtmlвид , що містить цей код: public ActionResult Upload() { return View(); }. Тому переконайтеся, що у вас є контролер, який називається, UploadControllerщо містить дві дії "Завантаження": одна для подання форми, а друга для обробки подання.
Дарин Димитров

2
Працює, але в контексті POST я пропоную додати: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.