दिलचस्प पोस्ट
टेम्पलेट केवल हेडर फाइल में क्यों लागू हो सकते हैं? NSCopying को कार्यान्वित करना PHP सत्र रीडायरेक्ट के बाद खो गया एक सिस्टम से WPF BitmapImage लोड करें। Draving.Bitmap जावास्क्रिप्ट में किसी विशेष सूचकांक में मैं एक कैरेक्टर को कैसे बदलूं? ओपेसीवी में एक छवि कैसे तेज करें? क्या हमेशा सी में शून्य है? फेसलेट टेम्पलेट में सीएसएस / जेएस / इमेज संसाधन का संदर्भ कैसे दिला जाए? सर्वर पर क्रॉस-डोमेन अनुरोध को कैसे सक्षम करें? सामग्री में कैरेट स्थिति प्राप्त करेंडिटेबल डिवेल AsyncTask और Looper.prepare () त्रुटि आपको C ++ में 'मित्र' का उपयोग कब करना चाहिए? एंड्रॉइड के साथ WCF सेवा कैसे खपत करें कन्स्ट्रक्टर से विधि कॉलिंग मैं एक MySQL डाटाबेस (स्कीमा नाम बदलकर) का नाम कैसे बदलूं?

मल्टीपार्ट / फ़ॉर्म-डेटा के साथ एएसपी.नेट एमवीसीए अजाक्स फॉर्म पोस्ट कैसे करें?

मैं एक एएसपी.नेट एमवीसी वेब साइट पर काम कर रहा हूं जिसमें एक ऐसा फॉर्म है जो मल्टीपार्ट / फ़ॉर्म डेटा एंटीप्ट विकल्प का उपयोग कर फाइल अपलोड करने की अनुमति देता है, जैसे कि फॉर्म टैग पर

<form enctype="multipart/form-data" method="post" action='<%= Url.Action("Post","Entries",new {id=ViewData.Model.MemberDetermination.DeterminationMemberID}) %>'> 

मैं इसके बजाय एक एएसपी.नेट एमवीसी अजाक्स फॉर्म पोस्ट करने के लिए यह कैसे लिखूँगा?

वेब के समाधान से एकत्रित समाधान "मल्टीपार्ट / फ़ॉर्म-डेटा के साथ एएसपी.नेट एमवीसीए अजाक्स फॉर्म पोस्ट कैसे करें?"

  1. आप कुछ अतिरिक्त अपलोडर (जैसे jQuery के एकाधिक फ़ाइल अपलोडर ) का उपयोग कर सकते हैं (मैं इस तरह से पसंद करता हूं और मैं एमएस अजाक्स का उपयोग नहीं करना चाहता)
  2. उपयोग:

     AjaxHelper.BeginForm("Post", "Entries", new {id=ViewData.Model.MemberDetermination.DeterminationMemberID}, new AjaxOptions(){/*some options*/}, new {enctype="multipart/form-data"}) 

लेकिन दूसरे मामले में मुझे यकीन नहीं है कि यह काम करेगा।

यह संभव है, लेकिन यह एक लंबा रास्ता है। चरण 1: अपना फ़ॉर्म लिखें

उदाहरण के लिए:

 @using (Ajax.BeginForm(YourMethod, YourController, new { id= Model.Id }, new AjaxOptions {//needed options }, new { enctype = "multipart/form-data" })) { <input type="file" id="image" name="image" /> <input type="submit" value="Modify" /> } 

चरण 2: अनुरोध को अवरुद्ध करें और उसे सर्वर पर भेजें

 <script type="text/javascript"> $(function() { $("#form0").submit(function(event) { var dataString; event.preventDefault(); var action = $("#form0").attr("action"); if ($("#form0").attr("enctype") == "multipart/form-data") { //this only works in some browsers. //purpose? to submit files over ajax. because screw iframes. //also, we need to call .get(0) on the jQuery element to turn it into a regular DOM element so that FormData can use it. dataString = new FormData($("#form0").get(0)); contentType = false; processData = false; } else { // regular form, do your own thing if you need it } $.ajax({ type: "POST", url: action, data: dataString, dataType: "json", //change to your own, else read my note above on enabling the JsonValueProviderFactory in MVC contentType: contentType, processData: processData, success: function(data) { //BTW, data is one of the worst names you can make for a variable //handleSuccessFunctionHERE(data); }, error: function(jqXHR, textStatus, errorThrown) { //do your own thing alert("fail"); } }); }); //end .submit() }); </script> 

चरण 3: क्योंकि आप एक एजेक्स कॉल करते हैं, शायद आप कुछ छवि या multipart/form-data का कुछ स्थान बदलना चाहते हैं

उदाहरण के लिए:

 handleSuccessFunctionHERE(data) { $.ajax({ type: "GET", url: "/Profile/GetImageModified", data: {}, dataType: "text", success: function (MSG) { $("#imageUploaded").attr("src", "data:image/gif;base64,"+msg); }, error: function (msg) { alert(msg); } }); } 

एमएसजी चर एक बेस 64 एन्क्रिप्टेड स्ट्रिंग है। मेरे मामले में यह छवि का स्रोत है

इस तरह से मैंने एक प्रोफ़ाइल चित्र को बदलने में कामयाब रहा और इसके बाद तस्वीर तुरंत अपडेट की गई। यह भी सुनिश्चित करें कि आप Application_Start (global.asax) ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); में जोड़ें ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); बहुत अच्छा नहीं?

पुनश्च: यह समाधान काम करता है इसलिए अधिक विवरण पूछने में संकोच न करें।

मैं इस छोटे से हैक पर आया था, जो इसे अच्छी तरह से हल करता है

 window.addEventListener("submit", function (e) { var form = e.target; if (form.getAttribute("enctype") === "multipart/form-data") { if (form.dataset.ajax) { e.preventDefault(); e.stopImmediatePropagation(); var xhr = new XMLHttpRequest(); xhr.open(form.method, form.action); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { if (form.dataset.ajaxUpdate) { var updateTarget = document.querySelector(form.dataset.ajaxUpdate); if (updateTarget) { updateTarget.innerHTML = xhr.responseText; } } } }; xhr.send(new FormData(form)); } } }, true); 

Jquery रूपों प्लगइन इस तरह से फ़ाइल अपलोड का समर्थन करता है

वास्तव में मैंने सवाल खुद जवाब दिया …

 <% using (Ajax.BeginForm("Post", "Entries", new { id = ViewData.Model.MemberDetermination.DeterminationMemberID }, new AjaxOptions { UpdateTargetId = "dc_goal_placeholder" }, new { enctype = "multipart/form-data" })) 

उन लोगों के लिए जो अभी भी @Ajax.BeginForm अजाक्स का उपयोग करने में समस्याएं हैं। बहुसंख्यक एनक्टीप्स के लिए बेस्टफॉर्म / एमवीसी में फाइल अपलोड

निदान और प्रस्तावित समाधान

@Ajax.BeginForm द्वारा निर्मित एक प्रपत्र तत्व पर "तत्व का निरीक्षण करें" टूल चला रहा है। @Ajax.BeginForm सहायक सहायक से पता चलता है कि सहायक, बल्कि बेवजह, निर्दिष्ट नियंत्रक पैरामीटर को ओवरराइड करता है यह मामला है अगर आपने अपने आंशिक पोस्टबैक के लिए एक अलग नियंत्रक को लागू किया है।

समस्या के लिए एक त्वरित-तय आपकी एचटीएमएल एक्शन एट्रिब्यूट वैल्यू स्पष्ट रूप से निर्दिष्ट करता है जैसे /<yourcontrollername>/<youractionname>

उदाहरण

 @using (Ajax.BeginForm("", "", new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "<TargetElementId>", InsertionMode = InsertionMode.Replace }, new { enctype = "multipart/form-data", action = "/<Controller>/<Action>" })) 

कोड जो मैंने इस्तेमाल किया और यह काम करता है !! यह @ जेम्स फ्लफी 'बर्टन समाधान की एक प्रति है मैं सिर्फ उसका उत्तर सुधार रहा हूं ताकि जो लोग एमवीसी के लिए नया हो, वे परिणाम को जल्दी से समझ सकें।

मेरे देखें निम्न हैं:

 @using (Ajax.BeginForm("FileUploader", null, new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "AjaxUpdatePanel" }, new { enctype = "multipart/form-data", id = "frmUploader" })){ <div id="AjaxUpdatePanel"> <div class="form-group"> <input type="file" id="dataFile" name="upload" /> </div> <div class="form-group"> <input type="submit" value="Upload" class="btn btn-default" id="btnUpload"/> </div> </div>} <script> window.addEventListener("submit", function (e) { var form = e.target; if (form.getAttribute("enctype") === "multipart/form-data") { if (form.dataset.ajax) { e.preventDefault(); e.stopImmediatePropagation(); var xhr = new XMLHttpRequest(); xhr.open(form.method, form.action); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { if (form.dataset.ajaxUpdate) { var updateTarget = document.querySelector(form.dataset.ajaxUpdate); if (updateTarget) { updateTarget.innerHTML = xhr.responseText; } } } }; xhr.send(new FormData(form)); } } }, true); 

निम्नलिखित मेरे नियंत्रक हैं:

 [HttpPost] public JsonResult FileUploader(HttpPostedFileBase upload) { if (ModelState.IsValid) { if (upload != null && upload.ContentLength > 0) { if (upload.FileName.EndsWith(".csv")) { Stream stream = upload.InputStream; DataTable csvTable = new DataTable(); using (CsvReader csvReader = new CsvReader(new StreamReader(stream), true)) { csvTable.Load(csvReader); } } else { return Json(new { dataerror = true, errormsg = "This file format is not supported" }); } } else { return Json(new { dataerror = true, errormsg = "Please Upload Your file" }); } } return Json(new { result = true }); } 

उपर्युक्त कोड का त्वरित नोट निम्नलिखित है: अजाक्स के माध्यम से, मैंने अपना एक्सेल (* .csv) फाइल सर्वर पर पोस्ट कर ली है और इसे एक नूगेट पैकेज (लुमेनवर्क्स सीएसवीआरडर) का उपयोग करके डाटाटेबल में पढ़ा है।

हुर्रे! यह काम करता हैं। धन्यवाद @ जेम्स

Ajax.BegineForm () मल्टीपार्ट फॉर्म डेटा के साथ काम करता है और यहां पर इसके लिए वर्किंग कोड का उदाहरण है:

राय:

 @using(Ajax.BeginForm("UploadFile","MyPOC", new AjaxOptions { HttpMethod = "POST" }, new { enctype = "multipart/form-data" })) { <input type="file" name="files" id="fileUploaderControl" /> <input type="submit" value="Upload" id="btnFileUpload" /> } 

नियंत्रक क्रिया विधि:

 public void UploadFile(IEnumerable<HttpPostedFileBase> files) { HttpPostedFileBase file = files.FirstOrDefault(); //Attach a debugger here and check whether you are getting your file on server side or null. if (file != null && file.ContentLength > 0) { //Do other validations before saving the file //Save File file.SaveAs(path); } } 

पीएस सुनिश्चित करें कि फ़ाइल अपलोडर नियंत्रण का "नाम" विशेषता और एडीआई पद्धति UploadFile () को पारित पैरामीटर का नाम समान होना चाहिए (यानी इस मामले में "फाइल")।

मैंने ब्रैड लार्सन को अमीरहोसेसेन मेहर्वर्ज़ी के साथ जवाब दिया, क्योंकि ब्रॉड जवाब प्रतिक्रिया को संभाल करने के लिए कोई भी तरीका प्रदान नहीं कर रहा था और अमीरहोसेन 2 पोस्टबैक पैदा कर रहा था। मैं सिर्फ ($ ('$ formBacklink')। मान्य ()) भेजने से पहले मॉडल सत्यापन कॉल करने के लिए।

 window.addEventListener("submit", function (e) { if ($('#formBacklink').valid()) { var form = e.target; if (form.getAttribute("enctype") === "multipart/form-data") { if (form.dataset.ajax) { e.preventDefault(); e.stopImmediatePropagation(); var dataString; event.preventDefault(); var action = $("#formBacklink").attr("action"); if ($("#formBacklink").attr("enctype") == "multipart/form-data") { //this only works in some browsers. //purpose? to submit files over ajax. because screw iframes. //also, we need to call .get(0) on the jQuery element to turn it into a regular DOM element so that FormData can use it. dataString = new FormData($("#formBacklink").get(0)); contentType = false; processData = false; } else { // regular form, do your own thing if you need it } $.ajax({ type: "POST", url: action, data: dataString, dataType: "json", //change to your own, else read my note above on enabling the JsonValueProviderFactory in MVC contentType: contentType, processData: processData, success: function (data) { //BTW, data is one of the worst names you can make for a variable //handleSuccessFunctionHERE(data); }, error: function (jqXHR, textStatus, errorThrown) { //do your own thing } }); } } } }, true); 

यदि आपको OnSuccess एजेक्सओपशन का उपयोग करने और / या अनुरोध का उपयोग करने की आवश्यकता है OnSuccess Request.IsAjaxRequest() नियंत्रक में अनुरोध प्रकार की जांच करने के लिए

 @using (Ajax.BeginForm("FileUploader", null, new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "elementToUpdate", OnSuccess = "mySuccessFuntion(returnedData)", OnFailure = "myFailureFuntion(returnedData)"}, new { enctype = "multipart/form-data" })) 

तब आप निम्न कोड का उपयोग कर सकते हैं (मैंने @ जेम्स फ्ली 'बर्टन के उत्तर को संशोधित किया है) यह प्रतिक्रिया पाठ को JSON ऑब्जेक्ट में बदल देगा, यदि यह हो सकता है (यदि आप चाहें तो इसे छोड़ सकते हैं)।

 <script> if(typeof window.FormData === 'undefined') { alert("This browser doesn't support HTML5 file uploads!"); } window.addEventListener("submit", function (e) { var form = e.target; if (form.getAttribute("enctype") === "multipart/form-data") { if (form.dataset.ajax) { e.preventDefault(); e.stopImmediatePropagation(); var xhr = new XMLHttpRequest(); xhr.open(form.method, form.action); xhr.setRequestHeader("x-Requested-With", "XMLHttpRequest"); // this allows 'Request.IsAjaxRequest()' to work in the controller code xhr.onreadystatechange = function () { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { var returnedData; //this variable needs to be named the same as the parameter in the function call specified for the AjaxOptions.OnSuccess try { returnedData = JSON.parse(xhr.responseText); //I also want my returned data to be parsed if it is a JSON object }catch(e){ returnedData = xhr.responseText; } if (form.dataset.ajaxSuccess) { eval(form.dataset.ajaxSuccess); //converts function text to real function and executes (not very safe though) } else if (form.dataset.ajaxFailure) { eval(form.dataset.ajaxFailure); } if (form.dataset.ajaxUpdate) { var updateTarget = document.querySelector(form.dataset.ajaxUpdate); if (updateTarget) { updateTarget.innerHTML = data; } } } }; xhr.send(new FormData(form)); } } }, true); </script> 

NB मैं जावास्क्रिप्ट फ़ंक्शन eval() का उपयोग स्ट्रिंग को एक फ़ंक्शन में कनवर्ट करने के लिए करता हूं … अगर किसी के पास एक बेहतर समाधान है तो कृपया टिप्पणी करें मैं भी JQuery JSON.parse() उपयोग करता हूं, इसलिए यह एक वेनिला जावास्क्रिप्ट समाधान नहीं है, लेकिन स्क्रिप्ट को कार्य करने के लिए आवश्यक नहीं है ताकि इसे हटाया जा सके।

मेरी छोटी जांच से ऊपर दिए गए सभी उत्तर अजाक्स के साथ होने वाली समस्या के आधार पर सही होने लगता है। बेगीफॉर्म। हालांकि, मैंने अभी देखा है कि समस्या कुछ मामलों में ~ / स्क्रिप्ट / jquery.unobtrusive-ajax.min.js जावास्क्रिप्ट लायब्रेरी के साथ है। तो मेरे मामले में मैंने इसे केवल दृश्य मॉडल से निकाल दिया और सॉर्ट किए जाने के लिए जेपीई फॉर्म प्लगइन का उपयोग करने का निर्णय लिया, इसके बजाय एचटीएमएल फॉर्म के साथ मेरी आवश्यक आवश्यकता के लिए। यह ऊपर सुझाव दिया गया है