Как написать «Html.BeginForm» в Razor


133

Если я напишу так:

form action = "Images" method = "post" enctype = "multipart / form-data"

оно работает.

Но в 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");
}

Является ли действие на самом деле «изображения» или это «Загрузить / Загрузить»?
Дж. Стин

на самом деле у меня есть два контроллера. контроллер изображения с действием 'image' .. и контроллер загрузки 'с действием загрузки ...
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содержащий два действия Upload: одно для обслуживания формы, а другое для обработки отправки.
Дарин Димитров

2
Работает, но в контексте POST я предлагаю добавить: @ Html.AntiForgeryToken ();
Фредерик Де Лене Мируз,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.