एमवीसी 3 फ़ाइल अपलोड और मॉडल बाइंडिंग


91

मेरे पास एक फ़ॉर्म अपलोड है जो काम करता है लेकिन मैं अपने डेटाबेस के लिए मॉडल जानकारी पास करना चाहूंगा ताकि फ़ाइल को निश्चित रूप से अलग नाम से बचाया जा सके।

यहाँ मेरा उस्तरा दृश्य है:

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

मॉडल जानकारी नियंत्रक के माध्यम से पारित नहीं है। मैंने पढ़ा है कि मुझे मॉडल को अपडेट करने की आवश्यकता हो सकती है, मैं यह कैसे करूंगा?


2
संबंधित समस्या के लिए stackoverflow.com/questions/9411563/… को देखें
LCJ

जवाबों:


123

आपके फ़ॉर्म में फ़ाइल के अलावा कोई भी इनपुट टैग नहीं है, इसलिए आपकी नियंत्रक कार्रवाई में आप अपलोड की गई फ़ाइल के अलावा और कुछ भी प्राप्त करने की उम्मीद नहीं कर सकते (यह सब सर्वर पर भेजा जा रहा है)। इसे प्राप्त करने का एक तरीका मॉडल की आईडी से छिपा हुआ टैग शामिल करना होगा, जो आपको आपके द्वारा पोस्ट किए जा रहे नियंत्रक क्रिया के अंदर अपने डेटास्टोर से इसे पुनः प्राप्त करने की अनुमति देगा (इसका उपयोग करें यदि उपयोगकर्ता मॉडल को संशोधित करने के लिए नहीं है लेकिन बस एक फ़ाइल संलग्न करें):

@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);
    ...
}

दूसरी ओर यदि आप उपयोगकर्ता को इस मॉडल को संशोधित करने की अनुमति देना चाहते हैं, तो आपको अपने मॉडल के प्रत्येक क्षेत्र के लिए उचित इनपुट फ़ील्ड शामिल करने की आवश्यकता होगी जिसे आप सर्वर पर भेजना चाहते हैं:

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

और फिर आपके पास डिफ़ॉल्ट मॉडल बाइंडर इस मॉडल को अनुरोध से पुनर्निर्माण करेगा:

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

1
मैं के fileरूप में हो रही है nullऔर Request.Files.Count0 भी है, अगर वहाँ formएक है AjaxFormऔर वहाँ भी कोई अंतर होगा routeValues?
प्रातः

8

हल किया

नमूना

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

नियंत्रक कार्रवाई से पैरामीटर का नोट शीर्षक इनपुट तत्वों के नाम के साथ मेल खाना चाहिए IEnumerable<HttpPostedFileBase> fileUpload->name="fileUpload[0]"

fileUpload मेल खाना चाहिए


2
यह समाधान कई फ़ाइलों के लिए मुझे मिला एकमात्र समाधान है। अपना कोड साझा करने के लिए धन्यवाद।
रोहन घो।

6

यदि आपके पास हमेशा आपके एक्शन पर पोस्ट करने वाले चित्र नहीं होंगे, तो आप कुछ इस तरह कर सकते हैं:

[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

कई फ़ाइलों के लिए; इनपुट के लिए नए " एकाधिक " विशेषता पर ध्यान दें :

प्रपत्र:

@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();
}

1

Url के नीचे से 1 डाउनलोड 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)
            {

            }
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.