2009-11-05 16 views
9

के साथ IsAjaxRequest() का पता लगाने मैं ASP.NET एमवीसी अनुप्रयोग पर फ़ाइल अपलोड करने के लिए JQuery फॉर्म प्लगइन का उपयोग कर रहा हूं। मैंने सीखा है कि चूंकि एक आईफ्रेम का उपयोग फ़ाइल अपलोड के लिए किया जाता है (XMLHttpRequest के बजाय, जो संभव नहीं है), IsAjaxRequest के लिए सर्वर-साइड चेक विफल हो जाता है।एएसपी.नेट एमवीसी और JQuery फॉर्म प्लगइन/फ़ाइल अपलोड

मैंने इस प्रश्न से संबंधित कुछ पोस्ट देखी हैं लेकिन इस मुद्दे के आसपास काम करने के लिए किसी भी अच्छे समाधान में नहीं आये हैं। मेरे शेष एप्लिकेशन के साथ, मैं जावास्क्रिप्ट सक्षम और जावास्क्रिप्ट अक्षम परिदृश्य दोनों का समर्थन करने में सक्षम होना चाहता हूं, यही कारण है कि मैं यह जानना चाहता हूं कि अनुरोध AJAX है या नहीं।

मुझे एहसास है कि उपयोग किए जाने वाले आईफ्रेम दृष्टिकोण तकनीकी रूप से अजाक्स नहीं है, लेकिन मैं एक AJAX प्रभाव की नकल करने की कोशिश कर रहा हूं।

किसी भी सुझाव का स्वागत किया जाएगा।

उत्तर

9

मैं सिर्फ महसूस किया कि मैं पूरी तरह से इस सवाल का जवाब नहीं था, इसलिए मैं यहाँ शीर्ष करने के लिए जोड़ा जा रहा है, और नीचे मेरे पुराने जवाब छोड़ने:

समस्या

जब एक iFrame पर एक फ़ाइल पोस्ट है, "एक्स-अनुरोधित-साथ" शीर्षलेख सेट नहीं है और आप जावास्क्रिप्ट में सामान्य फ़ॉर्म पोस्ट के लिए विशिष्ट अनुरोध शीर्षलेख सेट नहीं कर सकते हैं। आपको अन्य चालों का सहारा लेना होगा, जैसे कि आपके पोस्ट के साथ एक छुपा फ़ील्ड भेजना जिसमें मूल्य शामिल है, और फिर इस स्थिति की जांच करने के लिए "IsAjaxRequest" एक्सटेंशन विधि को बदलें या ओवरराइड करें। How to override an existing extension method?

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


jQuery वास्तव में 'एक्स-अनुरोधित-साथ' शीर्षलेख को डिफ़ॉल्ट रूप से 'XMLHttpRequest' पर सेट करता है। जब तक आप jQuery पर अपने सभी AJAX कॉल करने के लिए सावधान रहें, तब तक यह काफी उपयोगी है।

अपनी आवश्यकताओं पर निर्भर करता है, यह आसान सेटअप करने के लिए एक कार्रवाई फिल्टर में पता लगाने इसलिए की तरह जहां जरूरत के लिए इसका इस्तेमाल, या यहाँ तक कि इसे बनाने में एक नियंत्रक वर्ग में है:

[jQueryPartial] 
public abstract class MyController : Controller 
{ 
    public bool IsAjaxRequest { get; set; } 
} 

ActionFilterAttribute:

public class jQueryPartial : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Verify if a XMLHttpRequest is fired. 
     // This can be done by checking the X-Requested-With 
     // HTTP header. 
     MyController myController = filterContext.Controller as MyController; 
     if (myController != null) 
     { 
      if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != null 
       && filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
      { 
       myController.IsAjaxRequest = true; 
      } 
      else 
      { 
       myController.IsAjaxRequest = false; 
      } 
     } 
    } 
} 

और कार्यान्वयन का उपयोग:

public class SomeController : MyController 
{ 
    public ActionResult Index() 
    { 
      if (IsAjaxRequest) 
       DoThis(); 
      else 
       DoThat(); 

      return View(); 
    } 
} 
+0

आपके कोड में , IsAjaxRequest हमेशा सत्य है, कोड के उद्देश्य को हरा रहा है .... साथ ही यह वही कार्यक्षमता है जो एक्सटेंशन विधि में मौजूद है ... ताकि वास्तव में आपकी मदद न हो। – zowens

+1

जानकारी के लिए धन्यवाद। आपके लीड के बाद, मैंने JQuery के माध्यम से एक छिपी हुई फॉर्म वैल्यू ("isFileUploadAjaxPost") को गतिशील रूप से जोड़ दिया। नियंत्रक में, मैं उस फॉर्म चर के लिए जाँच करता हूं। यदि यह मौजूद है, तो मैं नई अपलोड की गई फ़ाइल के लिए "संपादन" दृश्य प्रदर्शित करने के लिए RedirectToAction को कॉल करने से पहले इस मान को संग्रहीत करने के लिए TempData का उपयोग करता हूं। प्राप्त करने की क्रिया विधि में, मैं अनुरोध करता हूं कि अनुरोध "AJAX" है या नहीं, यह निर्धारित करने के लिए कि मैं अनुरोध करता हूं कि यह अनुरोध करने के लिए Request.IsAjaxRequest() (जैसा कि मैं सभी के साथ कर रहा हूं) के साथ-साथ मेरा TempData मान भी जांचता हूं। बहुत अच्छा काम करता है। धन्यवाद! – goombaloon

+0

@zowens: मैंने अब कोड तय किया है, लेकिन हाँ, मुझे इसे बनाने के बाद एहसास हुआ और फिर IsAjaxRequest एक्सटेंशन विधि को देखकर यह वही है। मैंने कोड को एक्शनफिल्टर से अनुकूलित किया है जो अनुरोध प्रकार के आधार पर गतिशील रूप से मास्टर पेज सेट करता है जो निश्चित रूप से उपर्युक्त कोड की तुलना में कुछ हद तक कम अनावश्यक है। – Jay

11

आपको ISAjaxRequest विधि के लिए सही होने के लिए "एक्स-अनुरोधित-साथ" शीर्षलेख सेट करने की आवश्यकता है। यहां यह है कि आप इसे jquery में कैसे करते हैं।

$(document).ready(function() { 
    jQuery.ajaxSetup({ 
      beforeSend: function (xhr) { 
       xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
       return xhr; 
      } 
    }); 
}); 
+0

JQuery फॉर्म प्लगइन फ़ाइल अपलोड के लिए XMLHttpRequest का उपयोग नहीं करता है। यह एक आईफ्रेम का उपयोग करता है। – goombaloon

+0

यह सही जवाब होगा, अगर यह काम करता है ... –

+1

कोणीय '$ httpProvider.defaults.headers.common = {'एक्स-अनुरोधित-साथ': 'XMLHttpRequest'} में आपके लिए काम किया;' – parliament

2

मैं सिर्फ acr ठोकर खाई इस प्रश्न को ओएसएस और बाद में बेहतर समाधान मिला, इसलिए यहां यह है (हर किसी के लिए जो Google से यहां आता है):

jQuery फॉर्म प्लगइन में दो विकल्प हैं जो इस मामले में मदद कर सकते हैं।

  1. अगर आप पोस्ट अनुरोध का उपयोग कर रहे, ऐसा लगता है कि यह हमेशा, iframe उपयोग कर रहा है, इसलिए यदि आप फ़ाइल अपलोड की जरूरत नहीं है, iframe की स्थापना = फॉर्म विकल्पों में झूठी मेरे मामले में मदद की।

  2. आप fileuploads के लिए iframe की जरूरत है, तो आप दोनों विकल्पों के साथ

    IsAjaxRequest() setting : data: { "X-Requested-With": "XMLHttpRequest" }

पूर्ण स्क्रिप्ट को बेवकूफ बनाने की विकल्पों में से डेटा संपत्ति का उपयोग कर सकते है कि तरह लग रहा है:

$('#someform').ajaxForm(
{ 
     dataType: 'json', 
     success: onSuccess, 
     error: onError, 
       iframe: false 
     data: { "X-Requested-With": "XMLHttpRequest" } 
    } 
); 
11

एएसपी.नेट एमवीसी 2 (और आगे) के रूप में Request पर एक विस्तार विधि है।

if (Request.IsAjaxRequest()) 
{ 
    // was an ajax request 
} 

एक नियंत्रक विधि पर एक jQuery विधि जैसे .load() का उपयोग Request.IsAjaxRequest() में परिणाम सच लौट जाएगा।

संबंधित मुद्दे