2013-03-18 6 views
11

के साथ एमवीसी 3 बाल क्रियात्मक रूप से विशेषता का उपयोग मैं एक केंडो ग्रिड में पंक्ति जोड़ने/संपादित करने के लिए आंशिक दृश्य लोड करने के लिए AJAX का उपयोग कर रहा हूं। जब मैं पंक्ति में एक संपादन बटन दबाता हूं तो मैं उपयोगकर्ता को सीधे ब्राउज़र से Home/AddModify कार्रवाई को कॉल करने की अनुमति नहीं देना चाहता हूं।एजेक्स

अगर मैं अपने "AddModify" कार्रवाई के लिए [ChildActionOnly] डाल यह मेरे आंशिक दृश्य लोड क्योंकि सब कुछ ajax कॉल में शामिल है नहीं करता है, और मैं कहीं एक @Html.Action("Home/AddModify",model) की तरह ध्यान में रखते हुए यह है करने के लिए नहीं करना चाहती। जब भी पेज लोड होता है तो मैं इसे शुरुआत से लोड नहीं करना चाहता हूं।

क्या मैं आंशिक दृश्य को कॉल कर सकता हूं ताकि इसे केवल मांग (गतिशील रूप से) पर देखा जा सके?

उत्तर

19

आपको क्या करना होगा एक AJAX केवल attribte

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute 
    { 
     public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
     { 
      return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest(); 
     } 
    } 

है जैसे कि यह घोषित this question

पर एक नजर डालें और इस तरह

[AjaxOnly] 
public ActionResult ajaxMethod() 
{ 

} 
+0

हाँ, ठीक है आपकी प्रतिक्रिया के लिए इस too.thank आप। –

+0

@kingjulian अगर यह उत्तर आपको मदद करता है, तो इसे स्वीकार करने के लिए स्वतंत्र महसूस करें। –

3

इसका इस्तेमाल आप IsAjaxRequest विस्तार पद्धति पर उपयोग कर सकते हैं HttpRequestBase।

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

आप एक actionfilter बना सकते हैं:

public class RestrictToAjaxAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      throw new InvalidOperationException("This action is only available via ajax"); 
     } 
    } 
} 

और अपनी कार्रवाई की चोटी पर इस विशेषता डाल:

[RestrictToAjax] 
public ActionResult YourAction() 
{ 
} 
+0

मुझे पता था कि एमवीसी 4 के बारे में बहुवचन ट्यूटोरियल में, और मैंने इसके बारे में नहीं सोचा था। यह मेरे लिए IsAJaxRequest का उपयोग करने के लिए पर्याप्त है, संदेश या त्रुटि पृष्ठ डालने के लिए अजेक्स ठीक नहीं था। Ideea के लिए बहुत धन्यवाद । –

+0

आपका स्वागत है! –

+0

अगर मैं एक त्रुटि फेंकने के बजाय एक HTML पृष्ठ वापस करना चाहता हूं, तो मैं यह कैसे कर सकता हूं? –

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