MVC 3 dosya yükleme ve model bağlama


91

Çalışan bir form yüklemem var ancak dosyayı elbette farklı bir adla kaydetmek için veritabanım için model bilgilerini iletmek istiyorum.

İşte Razor görünümüm:

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

İşte denetleyicim:

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

Model bilgisi kontrol cihazına aktarılmaz. Modeli güncellemem gerekebileceğini okudum, bunu nasıl yapacağım?


2

Yanıtlar:


123

Formunuz dosya dışında herhangi bir giriş etiketi içermediğinden, denetleyici eyleminizde yüklenen dosyadan başka bir şey almayı bekleyemezsiniz (sunucuya gönderilen budur). Bunu başarmanın bir yolu, modelin kimliğini içeren gizli bir etiket eklemektir; bu, onu gönderdiğiniz denetleyici eylemi içindeki veri deponuzdan almanıza olanak tanır (bunu, kullanıcının modeli değiştirmesi gerekmiyorsa kullanın, ancak basitçe bir dosya ekleyin):

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

ve sonra denetleyici eyleminizde:

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

Öte yandan, kullanıcının bu modeli değiştirmesine izin vermek istiyorsanız, modelinizin sunucuya gönderilmesini istediğiniz her bir alanı için uygun giriş alanlarını eklemeniz gerekecektir:

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

ve sonra, varsayılan model bağlayıcının bu modeli istekten yeniden yapılandırmasına sahip olacaksınız:

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

1
Ben alıyorum fileolarak nullve Request.Files.Counteğer olmalı, herhangi bir fark olur çok 0'dır formbir olduğunu AjaxFormve orada routeValuesyanı?
bjan

8

Çözüldü

Modeli

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

Kontrolör

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

Ve Görüntüle

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

Denetleyici eyleminden parametre başlığı, giriş öğelerinin adıyla eşleşmelidir IEnumerable<HttpPostedFileBase> fileUpload->name="fileUpload[0]"

fileUpload eşleşmelidir


2
Bu çözüm, birden çok dosya için bulduğum tek çözüm. Kodunuzu paylaştığınız için teşekkürler.
Rojan Gh.

6

Her zaman eyleminize gönderilen resimleriniz olmayacaksa, şöyle bir şey yapabilirsiniz:

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

} 

1

Birden çok dosya için; girdi için yeni " çoklu " özniteliğine dikkat edin :

Form:

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

Denetleyici:

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

1

1. jquery.form.js dosyasını aşağıdaki url'den indir

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

Aşağıdaki kodu cshtml olarak yazın

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

Eylem yöntemi: -

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

            }
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.