2011-12-02 20 views
104

Si escribo de esta manera:Cómo escribir "Html.BeginForm" en la maquinilla de afeitar

form action = "Imágenes" method = "post" enctype = "multipart/form-data"

funciona.

Pero en Razor con '@' no funciona. ¿Cometí algún error?

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

Mi controlador se ve así:

[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"); 
} 
+0

Es la acción realmente "imágenes" o es "Subir/Cargar"? –

+0

en realidad tengo dos controladores. controlador de imagen con acción 'imagen' ... y controlador de carga 'con acción de carga ... –

Respuesta

160

El siguiente código funciona bien:

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

y genera como se esperaba:

<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 otro lado, si estás escribiendo este código dentro de t El contexto de otra construcción del lado del servidor, como if o foreach, debe eliminar @ antes del using. Por ejemplo:

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

En lo que se refiere a su código del lado del servidor, aquí está how to proceed:

[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

gracias. Mira el controlador que actualicé en mi pregunta. No funciona con el código Razor .. –

+2

@ user1076915, ¿qué significa * no funciona *? Podrías ser un poco más específico. He actualizado mi respuesta con un código de ejemplo de cómo podría ser la acción de su controlador. Si no puede obtener el archivo cargado en la acción del controlador que podría significar que ha anidado las etiquetas '

' (que no está permitido en HTML) o puede estar utilizando algún javascript que secuestra el envío normal de formularios y realiza una solicitud AJAX que no funciona con las cargas de archivos. –

+0

Utilicé la acción de su controlador y la cuchilla '@using' ... pero muestra -> Descripción: HTTP 404. El recurso que está buscando (o una de sus dependencias) podría haberse eliminado, cambiaron su nombre, o está temporalmente no disponible. Revise la siguiente URL y asegúrese de que esté escrita correctamente. –

Cuestiones relacionadas