Carga de archivo MVC 3 y encuadernación de modelo

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

Aquí está mi vista Razor:

@model CertispecWeb.Models.Container @{ ViewBag.Title = "AddDocuments"; } 

AddDocuments

@Model.ContainerNo @using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" })) { }

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

La información del modelo no se pasa al controlador. He leído que podría necesitar actualizar el modelo, ¿cómo lo haría?

Su formulario no contiene ninguna etiqueta de entrada que no sea el archivo, por lo que en la acción de su controlador no puede esperar obtener nada más que el archivo cargado (eso es todo lo que se envía al servidor). Una forma de lograr esto sería incluir una etiqueta oculta que contenga la identificación del modelo que le permitirá recuperarla de su almacén de datos dentro de la acción del controlador en la que está publicando (use esto si el usuario no debe modificar el modelo, pero simplemente adjunte un archivo):

 @using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.HiddenFor(x => x.Id)   } 

y luego en tu acción de controlador:

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

Por otro lado, si desea permitir que el usuario modifique este modelo, deberá incluir los campos de entrada adecuados para cada campo de su modelo que desee que se envíe 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)   } 

y luego tendrá la carpeta de modelo predeterminada para reconstruir este modelo a partir de la solicitud:

 [HttpPost] public ActionResult Uploadfile(Container containers, HttpPostedFileBase file) { ... } 

Resuelto

Modelo

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

Controlador

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

Y vista

 @using (Html.BeginForm("Create", "Book", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.EditorFor(m => m) 


}

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

fileUpload debe coincidir

Si no siempre tendrá imágenes publicando en su acción, puede 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); } } } } 

Para múltiples archivos; tenga en cuenta el nuevo atributo ” múltiple ” para la entrada:

Formar:

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

Controlador:

 [HttpPost] public ActionResult FileImport(IEnumerable files) { return View(); } 

1ra descarga del archivo jquery.form.js de la URL siguiente

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

Escriba el código a continuación en cshtml

 @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data", id = "frmTemplateUpload" })) { 
Add Template

}

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) { } }