2012-03-01 16 views
27

के भीतर कार्रवाई पैरामीटर के मान रही मैं एक कार्य है कि मैं jQuery से करने के लिए पोस्ट कर रहा हूँ है। मेरे पास कुछ अन्य समूह क्रियाएं हैं इसलिए मैं यह सुनिश्चित करने के लिए एक प्राधिकरण विशेषता का उपयोग करना चाहता हूं कि परिवर्तन करने वाले व्यक्ति को परिवर्तन करने की अनुमति है।एक कार्रवाई फिल्टर

मेरे पास पहले से AuthorizationAttribute है जो groupId को filterContext.HttpContext.Request.Params["groupId"] तक पहुंचकर सफलतापूर्वक GET अनुरोधों पर पुनर्प्राप्त करता है लेकिन जब POSTs की बात आती है तो यह काम नहीं करती है। Request.Form खाली है और इसलिए Request.Params है।

यहाँ कोड मैं अपने प्राधिकरण विशेषता में है:

public int groupId { get; set; } 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    username = httpContext.User.Identity.Name.Split('\\').Last(); 

    // awesome permissions checking goes here... 

    return authorized; 
} 

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    groupId = int.Parse(filterContext.HttpContext.Request.Params["groupId"]); // this line throws an exception 
    base.OnAuthorization(filterContext); 
} 

मैं इस answer पर ध्यान दिया है, लेकिन मेरी Form संपत्ति खाली :(

jQuery पोस्ट दिखाने के लिए अपडेट किया गया है:

var serverComm = { 
    post: function (url, data) { 
     return $.ajax({ 
      url: url, 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      data: JSON.stringify(data) 
     }); 
    }, 
    get: function (url, data) { 
     return $.ajax({ 
      url: url, 
      type: 'GET', 
      cache: false, 
      contentType: 'application/json; charset=utf-8', 
      data: data 
     }); 
    } 
}; 
// some awesome code later... 
serverComm.post(editGroupNameUrl, { groupId: group.id, name: newName }) 
+0

और पैरामीटर फॉर्म पैरामीटर के रूप में है? क्या QueryString पर यह एक मौका है? – ivowiblo

+0

क्वेरीस्ट्रिंग खाली है। और आपका क्या मतलब है "फॉर्म पैरामीटर के रूप में है"? आप शीर्ष कोड उदाहरण में मेरी कार्रवाई देख सकते हैं – soniiic

+0

क्या आप फॉर्म कोड पोस्ट कर सकते हैं? – ivowiblo

उत्तर

42

आपका कोड काम नहीं करने का कारण यह है क्योंकि आप JSON स्ट्रिंग के रूप में अपना अनुरोध भेज रहे हैं। तो पोस्ट बॉडी में कोई अनुरोध पैरामीटर नहीं हैं और आप उन्हें Request.Params में नहीं ला सकते हैं।

तो बजाय:

filterContext.HttpContext.Request.Params["groupId"] 

उपयोग:

filterContext.Controller.ValueProvider.GetValue("groupId").AttemptedValue 

इस ग्राहक द्वारा भेज संबंधित मान प्राप्त करने के लिए मूल्य प्रदाता (अपने मामले JsonValueProvider में) क्वेरी करेगा।

+0

क्या यह अधिकृतकरण में काम करेगा? – Dragon

1

स्ट्रिंग के बिना प्रयास करें। मुझे लगता है कि एमवीसी अनुरोध पैरामीटर के अलावा बाध्यकारी का एक और तरीका समझ रहा है -> क्रिया पैरामीटर। मुझे लगता है यह जेसन पोस्ट की समझ में है। JQuery, यदि आप केवल डेटा ऑब्जेक्ट (स्ट्रिंग के बिना) पास करते हैं तो प्रत्येक फ़ील्ड को अनुरोध पैरामीटर के रूप में पोस्ट करेगा (कम से कम, मुझे ऐसा लगता है)। कोशिश करना आसान है :)

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