2012-12-30 17 views
11

साथ फ़ाइल डाउनलोड मैं MVCलागू करने के लिए कैसे AJAX और MVC

के तहत कुछ पैरामीटर वाला jQuery AJAX कॉल का उपयोग कर

उदाहरण

(javascript) 
function DoDownload(startDate) { 

    $.ajax({ 
    url:"controller/GetFile/", 
    data: {startDate:startDate} 
    ... 
    }); 

} 

C# Controller Code 

public void GetFile(string startDate) { 

    var results = doQuearyWith(startDate); 

    // Create file based on results 

    .... 
    // HOw do I tell the server to make this a file download?? 
} 

मैं आम तौर पर सिर्फ होगा द्वारा एक फ़ाइल डाउनलोड कार्रवाई प्रदान करना चाहते हैं मेरे फ़ाइल एक लिंक डाउनलोड करें जैसे:

<a h r e f="mycontroller/getfile/1"/>Download</a> 

लेकिन तिथि के ऊपर के मामले में गतिशील होगी।

यदि मैं AJAX का उपयोग नहीं करता, तो जावास्क्रिप्ट का उपयोग कर एमवीसी नियंत्रक को पैरा में पास करने का पसंदीदा तरीका क्या होगा?

उदाहरण:

window.location = "mycontroller/GetFile/" + $("#fromDate").val(); 

तारीख संभालने 2012/12/25 इस उत्पादन होगा

है
mycontroller/GetFile/12/25/2012 

MVC तीन पैरामीटर के रूप में इस का इलाज होगा?

+0

आपके प्रश्न का उत्तर [इस] [1] लिंक पर पाया जा सकता है। [1]: http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc/5830215#5830215 –

+0

जब तक आप एक "hackable" यूआरएल की जरूरत है , मुझे यकीन नहीं है कि आपको इसे इस तरह से करने की ज़रूरत है। बस एक नियंत्रक विधि के लिए पैरामीटर के रूप में तारीख को पास करें और फिर सुझाए गए FileResult कार्यान्वयन का उपयोग करें। आप इसे जितना कठिन होना चाहते हैं उससे ज्यादा कठिन हो सकता है? –

उत्तर

11

क्या मैं कर रहा तरह मेरे जावास्क्रिप्ट से मेरी नियंत्रक बुला रहा है समाप्त हो गया:

var url = "/mycontroller/GetFile?startDate=" + $("#mydate").val() + etc... 

window.location = url; 

mycontroller.cs

public void GetFile(DateTime startDate) 
{ 

} 

मेरी मूल चिंता का विषय था तारीख पैरामीटर के साथ। मैं इसे पार्स नहीं करना चाहता था।

+2

मेरी राय पर सबसे आसान कामकाजी समाधान :) –

+0

दुनिया में अलग-अलग तिथियों के बावजूद एक और टिप्पणी, अब हर जगह किसी भी अन्य प्रारूप के बजाय आईएसओ -8601 का उपयोग करने के लिए बहुत स्वीकार्य है। दुर्भाग्य से एमवीसी एक अजीब तरीके से तारीखों को लपेटता है और यह वास्तव में सबसे लोकप्रिय नहीं है। मेरा सुझाव है कि आप हमेशा आईएसओ -8601 का उपयोग करें क्योंकि आप भविष्य में अपने नियंत्रक को एक आसान तरीके से बदल सकते हैं। –

+0

यह एक फ़ाइल डाउनलोड करने के लिए पूरी तरह से काम करता है जहां एक jQuery अजाक्स कॉल नहीं करता है। इस terse अभी तक सुरुचिपूर्ण समाधान के लिए धन्यवाद! – PhillipPDX

1

आपकी नियंत्रक कार्रवाई विधि को शून्य के बजाय फ़ाइलResult वापस करना चाहिए। और AJAX के माध्यम से ऐसा करने की कोई आवश्यकता नहीं है - असल में, आप AJAX के साथ ऐसा नहीं करना चाहते हैं। आपको शामिल ब्राउज़र की आवश्यकता होगी ताकि उपयोगकर्ता के लिए डाउनलोड संवाद प्रदान किया जा सके।

इन कड़ियों देखें:

Handling an ASP.NET MVC FileResult returned in an (jQuery) Ajax call

File download in Asp.Net MVC 2

मुझे आशा है कि इस मदद करता है।

+0

मैं वास्तव में एमवीसी नियंत्रक को पैरा को पास करने के तरीके पर अटक गया हूं। या सर्वश्रेष्ठ तरीका क्या है। – Arcadian

+0

नीचे रोमिया का उत्तर दिखाता है कि एक्शनलिंक का उपयोग करके अपनी क्रिया विधि में मूल्यों को कैसे पास किया जाए। –

2

आप ब्राउज़र पर वापस फ़ाइल लौटने के लिए File नियंत्रक वर्ग की विधि का उपयोग कर सकते हैं।

नीचे नमूना एक पीडीएफ फ़ाइल देता है।

public ActionResult GetFile(int id) 
{ 
    var fileInfo=repositary.GetFileDedetails(id); 
    var byteArrayOFFile=fileInfo.FileContentAsByteArray(); 
    return File(byteArrayOFFile,"application/pdf","yourFriendlyName.pdf"); 
} 

मान लिया जाये कि repositary.GetFileDedetails विधि आईडी से फ़ाइल का विवरण देता है।

आप फ़ाइल को भौतिक स्थान (पथ) या स्ट्रीम से भी वापस कर सकते हैं। File विधि के सभी overloads जांचें और उपयुक्त एक का उपयोग करें।

इसका अजाक्स से कोई लेना देना नहीं है। ब्राउज़र पर यह सामान्य GET अनुरोध है। तो अपने मामले में

HtmlHelper.ActionLink(
    string linkText, 
    string actionName, 
    string controllerName, 
    object routeValues, 
    object htmlAttributes 
) 

:

3

ActionLink सहायक का उपयोग करना, आप अपने नियंत्रक करने के लिए कई पैरामीटर पारित कर सकते हैं

@Html.ActionLink("Download file", "GetFile", "MyController", new { startDate = "##" }, new { id="mydownloadlink" }) 

jQuery का उपयोग करके आप में startDate का मूल्य बदल सकते अपने दिनांक पिकर या टेक्स्टबॉक्स की सामग्री के साथ लिंक करें।

$("#mydownloadlink").attr("href").replace("##", $("#yourdatetexbox").val); 

फिर, अपने नियंत्रक में, बस अन्य उत्तर यहाँ से एक है, के बारे में FileResult का उपयोग करें।

आशा इस मदद आप ...

+0

यह काम कर रहा है। धन्यवाद –