Como escrever "Html.BeginForm" no Razor

133

Se eu escrever assim:

ação do formulário = "Imagens" método = "post" enctype = "multipart / form-data"

funciona.

Mas no Razor com '@' não funciona. Eu cometi algum erro?

@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>
}

Meu controlador fica assim:

[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
fonte
A ação é realmente "imagens" ou é "Upload / Upload"?
J. Steen
na verdade eu tenho dois controladores. controlador de imagem com ação 'imagem' .. e controlador de upload 'com ação de upload ..
kk-dev11 02/12

Respostas:

200

O código a seguir funciona bem:

@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>
}

e gera conforme o esperado:

<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>

Por outro lado, se você estiver escrevendo esse código dentro do contexto de outra construção do lado do servidor, como um ifou foreachvocê deve remover o @antes de using. Por exemplo:

@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>
    }
}

No que diz respeito ao código do lado do servidor, veja como proceder :

[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");
}
Darin Dimitrov
fonte
1
obrigado. Olhe para o controlador que atualizei na minha pergunta. Ele não funciona com o código Navalha ..
kk-dev11
2
@ user1076915, o que isso não significa ? Você poderia ser um pouco mais especifico. Atualizei minha resposta com um código de exemplo de como poderia ser a ação do seu controlador. Se você não conseguir obter o arquivo carregado na ação do controlador, isso pode significar que você aninhou <form>tags (o que não é permitido em HTML) ou pode estar usando algum javascript que rouba o envio normal do formulário e faz uma solicitação AJAX que não é ' Não trabalhe com uploads de arquivos.
Darin Dimitrov
Usei a ação do controlador e o razor '@using' .. mas ele exibe -> Descrição: HTTP 404. O recurso que você está procurando (ou uma de suas dependências) poderia ter sido removido, ter seu nome alterado ou ser Temporariamente indisponível. Revise o seguinte URL e verifique se ele está escrito corretamente.
Kk-dev11
@ user1076915, quando você recebe essa mensagem de erro? Quando você deseja renderizar o formulário de upload ou quando o envia? No primeiro caso, garantir que você tenha uma GETação Carregar que servirá a Upload.cshtmlexibição que contém este código: public ActionResult Upload() { return View(); }. Portanto, verifique se você tem um controlador chamado UploadControllercontendo as duas ações de Upload: uma para servir o formulário e a outra para processar o envio.
Darin Dimitrov
2
Funciona, mas em um contexto POST, sugiro adicionar: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze 24/10