将viewmodel和多个文件上传的文件内容传递给控制器

时间:2018-01-19 13:07:59

标签: asp.net-mvc asp.net-mvc-4 viewmodel asp.net-mvc-viewmodel multiple-file-upload

我尝试将使用文件上传控件上传的viewmodel和多个文件传递给控制器​​。无论files参数传递为null。

如何将上传的文件传递给控制器​​。

这是我的观点

@model DMS.BO.ViewModels.UploadDocumentViewModel
<div class="content-wrapper">
    <form id="frmAddService" action="@Url.Action("UploadDocuments", "Home")" method="post" enctype="multipart/form-data">
          @if (TempData["Message"] != null)
                {
                    <script type="text/javascript">
                        window.onload = function () {
                            alert("@TempData["Message"]");
                        };
                    </script>
                }
        <div class="row">
            <div class="col-sm-6">
                <label class="control-label " for="CompanyName">Company Name</label>
                @* <input type="text" class="form-control required tobecleared" name="CompanyName" data-val-message="Please enter company name"
                    placeholder="Company Name*" />*@
                <select class="form-control qf-level required" name="uploadvm.hostbo.CompanyId" id="CompanyId"
                    data-val-message="Please select a Company">
                    <option value="" selected disabled>Company*</option>
                    @foreach (var item in Model.companies)
                    {
                        <option value="@item.CompanyId">@item.CompanyName</option>
                    }
                </select>
            </div>
             <div class="col-sm-4">
                <label class="control-label " for="HostName">Host Ip</label>
                <input type="text" class="form-control required tobecleared" data-action="@Url.Action("GetHostName", "Home")" id="HostIp" name="uploadvm.hostbo.HostIP" data-val-message="Please enter Host IP"
                    placeholder="Host IP*" />
            </div>
        </div>
        <br />
        <div class="row">
            <div class="col-sm-4">
                <label class="control-label " for="HostName">Host Name</label>
                <input type="text" class="form-control required tobecleared" name="uploadvm.hostbo.HostName" id="HostName" data-val-message="Please enter Host Name"
                    placeholder="Host Name*" />
            </div>
            <div class="col-sm-1">
                <label class="control-label " for="IsActive">Active</label>
                <input type="checkbox" id="IsActive" class="form-control" name="uploadvm.hostbo.IsActive" value="true" />
            </div>
            <div class="col-sm-6">
                <label class="control-label " for="ServiceName">Service Name</label>
                @* <input type="text" class="form-control required tobecleared" name="ServiceName" data-val-message="Please enter service Name"
                    placeholder="Service Name*" />*@
                <select class="form-control qf-level required" name="uploadvm.servicebo.ServiceId" id="ServiceName"
                    data-val-message="Please select a Service">
                    <option value="" selected disabled>Service*</option>
                    @foreach (var item in Model.services)
                    {
                        <option value="@item.ServiceId">@item.ServiceName</option>
                    }
                </select>
            </div>
        </div>
        <br />
        <div class="row">
            <div class="col-sm-4">
                <label class="control-label " for="ServiceProcedureVersion">Document Version</label>
                <input type="text" class="form-control required tobecleared" name="uploadvm.serviceprocedurebo.VersionNum" data-val-message="Please enter Document Version"
                    placeholder="Document Version*" />
            </div>
            <div class="col-sm-4">
                <label class="control-label " for="ServiceProcedureDate">Document Date</label>
                <input type="text" class="form-control required tobecleared service_procedure_date" name="uploadvm.serviceprocedurebo.Date" data-val-message="Please enter date"
                    placeholder="Document Date*" value="@DateTime.Today.ToLongDateString()" />
            </div>
        </div>
        <br />
        <div class="row">
            <div class="col-sm-3">
                <input style="display: inline" id="filesToUpload" type="file" name="files" multiple="multiple" />
            </div>
            <div class="col-sm-6">
                <ul id="fileList">
                    <li></li>
                </ul>
            </div>
            <div class="col-sm-2">
                <label class="control-label"></label>
                <input type="submit" name="submit" value="Submit" class="btn btn-primary" />
            </div>
        </div>
        <br />

        <div id="ExistingServices">

        </div>            
    </form>      

</div>

我的控制器

[HttpPost]
public ActionResult UploadDocuments(UploadDocumentViewModel uploadvm, IEnumerable<HttpPostedFileBase> files)
{
    HostBL hostbl = new HostBL();
    DocumentBL documentbl = new DocumentBL();
    //CompanyBL companybl=new CompanyBL();
    long hostid = hostbl.CheckIfHostExists(uploadvm.hostbo.HostIp, uploadvm.hostbo.CompanyId);
    if (hostid == 0 || hostid == null)
        hostid = hostbl.InsertHost(uploadvm);
    uploadvm.hostbo.HostId = hostid;
    long serviceprocedureid = hostbl.InsertDetails(uploadvm);
    //var CompanyName = companybl.getCompanyName(uploadvm.companybo.CompanyId);
    List<ProcedureDocumentBO> documents = new List<ProcedureDocumentBO>();
    //iterating through multiple file collection   

    foreach (HttpPostedFileBase file in files)
    {
        //Checking file is available to save.  
        if (file != null)
        {
            ProcedureDocumentBO proceduredocumentbo = new ProcedureDocumentBO();

            var InputFileName = Path.GetFileName(file.FileName);
            var filename = uploadvm.companybo.CompanyName 
                + "_" + uploadvm.hostbo.HostName
                + "_" + uploadvm.servicebo.ServiceName
                + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff")
                + "_" + InputFileName;
            proceduredocumentbo.DocumentFileName = filename;
            proceduredocumentbo.ServiceProcedureId = serviceprocedureid;
            proceduredocumentbo.CreatedOn = System.DateTime.Today;
            var ServerSavePath = Path.Combine(Server.MapPath("~/UploadedFiles/") + filename);
            //Save file to server folder  
            file.SaveAs(ServerSavePath);
            //assigning file uploaded status to ViewBag for showing message to user.  
            //ViewBag.UploadStatus = uploadvm.files.Count().ToString() + " files uploaded successfully."; 
            documents.Add(proceduredocumentbo);
            //long documentid=documentbl.InsertDocument(uploadvm.documentbo);
        }
    }

    uploadvm.documents = documents;
    int res = documentbl.InsertDocuments(uploadvm);

    //uploadvm.documents=
    if (res <= 0)
    {
        TempData["Message"] = "Documents Not Uploaded";
    }
    else
    {
        TempData["Message"] = "Documents Uploaded";
    }

    UploadDocumentViewModel uploadvmm = new UploadDocumentViewModel();
    CompanyBL companybl = new CompanyBL();
    ServiceBL servicebl = new ServiceBL();
    uploadvmm.companies = companybl.GetAllCompanies();
    uploadvmm.services = servicebl.GetAllServices();
    return View(uploadvmm);
}

传递的files参数对我来说始终为null。如何传递文件?

1 个答案:

答案 0 :(得分:0)

public string writeFile(HttpPostedFileBase file, string fileName, string folder, HttpServerUtilityBase Server)
{
    string FileName = fileName;
    if (file != null && file.ContentLength > 0)
    {
        FileName = string.Format("{0}" + file.FileName.Trim('"'), DateTime.Now.Ticks);
        string nameAndLocation = "~/" + folder + "/" + FileName;
        file.SaveAs(Server.MapPath(nameAndLocation));
    }
    return FileName;
}

[HttpPost]
public string upload(Tunes tune)
{
    var img = Request.Files["ImgFile"];
    var mp3 = Request.Files["Mp3File"];
    var image = writeFile(img, "", "TuneImages", Server);
    var mp3Name = writeFile(mp3, "", "mp3", Server);
    tune.mp3 = mp3Name;
    tune.img = image;
    db.Tunes.Add(tune);
    db.SaveChanges();
    return "Record Save Successfully";
}

您可以循环Request.Files,您可以轻松上传多个文件而无需绑定视图模型。 Request.Files["ImgFile"] Request.Files["Mp3File"]

输入类型文件的

ImgFileMp3File名称