Tengo un formulario de carga que funciona, pero me gustaría pasar la información del modelo para mi base de datos para guardar el archivo con un nombre diferente, por supuesto.

Aquí está mi maquinilla de Afeitar vista:

@model CertispecWeb.Models.Container

@{
  ViewBag.Title = "AddDocuments";
}

<h2>AddDocuments</h2>

@Model.ContainerNo

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, 
            new { enctype = "multipart/form-data" }))
{
    <input type='file' name='file' id='file' />
    <input type="submit" value="submit" />
}

Aquí está mi Controlador:

[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
     if (file.ContentLength > 0)
     {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"),
                       containers.ContainerNo);
        file.SaveAs(path);
     }

     return RedirectToAction("Index");
}

El modelo de información no pasa a través del controlador. He leído que necesito para actualizar el modelo, ¿cómo puedo hacer esto ?

InformationsquelleAutor Francis | 2011-01-24

5 Comentarios

  1. 124

    El formulario no contiene la etiqueta de entrada distinta a la del archivo de modo que en la acción del controlador se puede esperar otra cosa que el archivo cargado (es todo lo que se envía al servidor). Una forma de lograr esto sería incluir una etiqueta oculta que contiene el id de la modelo que le permitirá recuperar de su almacén de datos dentro de la acción de controlador que se va a registrar (utilice esta opción si el usuario no debe modificar el modelo, sino simplemente adjuntar un archivo):

    @using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.HiddenFor(x => x.Id)
        <input type="file" name="file" id="file" />
        <input type="submit" value="submit" />
    }

    y, a continuación, en su acción de controlador:

    [HttpPost]
    public ActionResult Uploadfile(int id, HttpPostedFileBase file)
    {
        Containers containers = Repository.GetContainers(id);
        ...
    }

    Por otro lado, si usted desea permitir que el usuario modifique este modelo, a continuación, tendrá que incluir la correcta campos de entrada para cada campo de su modelo que usted desea que se envíen al servidor:

    @using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.TextBoxFor(x => x.Prop1)
        @Html.TextBoxFor(x => x.Prop2)
        @Html.TextBoxFor(x => x.Prop3)
        <input type="file" name="file" id="file" />
        <input type="submit" value="submit" />
    }

    y, a continuación, usted va a tener el valor predeterminado del modelo de cuaderno de reconstruir este modelo a partir de la solicitud:

    [HttpPost]
    public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
    {
        ...
    }
    • Muchas gracias, funciona muy bien. Francisco
    • Estoy recibiendo file como null y Request.Files.Count es 0 también, ¿habría alguna diferencia si el form es un AjaxForm y hay routeValues así?
  2. 8

    Resuelto

    Modelo

    public class Book
    {
    public string Title {get;set;}
    public string Author {get;set;}
    }

    Controlador de

    public class BookController : Controller
    {
         [HttpPost]
         public ActionResult Create(Book model, IEnumerable<HttpPostedFileBase> fileUpload)
         {
             throw new NotImplementedException();
         }
    }

    Y Ver

    @using (Html.BeginForm("Create", "Book", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {      
         @Html.EditorFor(m => m)
    
         <input type="file" name="fileUpload[0]" /><br />      
         <input type="file" name="fileUpload[1]" /><br />      
         <input type="file" name="fileUpload[2]" /><br />      
    
         <input type="submit" name="Submit" id="SubmitMultiply" value="Upload" />
    }

    Título de la nota de parámetro de controlador de acción debe coincidir con el nombre de los elementos de entrada
    IEnumerable<HttpPostedFileBase> fileUpload -> name="fileUpload[0]"

    fileUpload debe coincidir con

    • Esta solución es la única solución que he encontrado para varios archivos. Gracias por compartir tu código.
  3. 6

    Si usted no siempre tiene imágenes de la publicación de su acción, puedes hacer algo como esto:

    [HttpPost]
    public ActionResult Uploadfile(Container container, HttpPostedFileBase file) 
    {
        //do container stuff
    
        if (Request.Files != null)
        {
            foreach (string requestFile in Request.Files)
            {
                HttpPostedFileBase file = Request.Files[requestFile]; 
                if (file.ContentLength > 0)
                {
                    string fileName = Path.GetFileName(file.FileName);
                    string directory = Server.MapPath("~/App_Data/uploads/");
                    if (!Directory.Exists(directory))
                    {
                        Directory.CreateDirectory(directory);
                    }
                    string path = Path.Combine(directory, fileName);
                    file.SaveAs(path);
                }
            }
        }
    
    } 
  4. 1

    Para varios archivos; tenga en cuenta la más reciente «múltiples» atributo de entrada:

    Forma:

    @using (Html.BeginForm("FileImport","Import",FormMethod.Post, new {enctype = "multipart/form-data"}))
    {
        <label for="files">Filename:</label>
        <input type="file" name="files" multiple="true" id="files" />
        <input type="submit"  />
    }

    Controlador:

    [HttpPost]
    public ActionResult FileImport(IEnumerable<HttpPostedFileBase> files)
    {
        return View();
    }
  5. 1

    1º descargar jquery.form.js archivo de la url a continuación

    http://plugins.jquery.com/form/

    Escribir a continuación el código en cshtml

    @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data", id = "frmTemplateUpload" }))
    {
    <div id="uploadTemplate">
    <input type="text" value="Asif" id="txtname" name="txtName" />
    <div id="dvAddTemplate">
    Add Template
    <br />
    <input type="file" name="file" id="file" tabindex="2" />
    <br />
    <input type="submit" value="Submit" />
    <input type="button" id="btnAttachFileCancel" tabindex="3" value="Cancel" />
    </div>
    <div id="TemplateTree" style="overflow-x: auto;"></div>
    </div>
    <div id="progressBarDiv" style="display: none;">
    <img id="loading-image" src="~/Images/progress-loader.gif" />
    </div>
    }
    <script type="text/javascript">
    $(document).ready(function () {
    debugger;
    alert('sample');
    var status = $('#status');
    $('#frmTemplateUpload').ajaxForm({
    beforeSend: function () {
    if ($("#file").val() != "") {
    //$("#uploadTemplate").hide();
    $("#btnAction").hide();
    $("#progressBarDiv").show();
    //progress_run_id = setInterval(progress, 300);
    }
    status.empty();
    },
    success: function () {
    showTemplateManager();
    },
    complete: function (xhr) {
    if ($("#file").val() != "") {
    var millisecondsToWait = 500;
    setTimeout(function () {
    //clearInterval(progress_run_id);
    $("#uploadTemplate").show();
    $("#btnAction").show();
    $("#progressBarDiv").hide();
    }, millisecondsToWait);
    }
    status.html(xhr.responseText);
    }
    });
    });
    </script>

    Método de acción :-

     public ActionResult Index()
    {
    ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
    return View();
    }
    public void Upload(HttpPostedFileBase file, string txtname )
    {
    try
    {
    string attachmentFilePath = file.FileName;
    string fileName = attachmentFilePath.Substring(attachmentFilePath.LastIndexOf("\\") + 1);
    }
    catch (Exception ex)
    {
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here