MVC 3file upload和模型绑定

我有一个表单上传工作,但我想传递我的数据库的模型信息,以保存该文件与当然不同的名称。

这是我的剃刀视图:

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

这是我的控制器:

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

型号信息没有传递给控制器​​。 我读过,我可能需要更新模型,我将如何做到这一点?

您的表单不包含除文件之外的任何input标签,因此在您的控制器操作中,除了上传的文件(即发送到服务器的所有内容)之外,您不能期望获得其他内容。 实现这一目的的一种方法是包含一个隐藏的标签,其中包含模型的id,它将允许您从发布的控制器动作中的数据存储区中检索它(如果用户不应该修改模型,只需附加一个文件):

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

然后在你的控制器动作:

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

另一方面,如果你想允许用户修改这个模型,那么你将需要为你想要发送到服务器的模型的每个字段包含适当的input字段:

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

然后你将有默认的模型绑定器从请求中重build这个模型:

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

解决了

模型

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

调节器

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

和视图

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

注意控制器操作的参数标题必须与input元素的名称匹配IEnumerable<HttpPostedFileBase> fileUpload – > name="fileUpload[0]"

fileUpload必须匹配

如果你不总是有图像张贴到你的行动,你可以做这样的事情:

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

对于多个文件; 注意input的较新的“ 多个 ”属性:

形成:

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

控制器:

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

首先从下面的url下载jquery.form.js文件

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

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

行动方法: –

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