2009-10-21 4 views
5

वास्तव में मेरे पास एक ऐसा एप्लिकेशन है जो कुछ क्लाइंट जानकारी पुनर्प्राप्त करने के लिए वेब सेवा का उपयोग कर रहा है। तो मैं तरह मेरे ActionResult अंदर प्रवेश जानकारी को मान्य किया गया था:एएसपी.नेट एमवीसी - एक्शनफिल्टर एट्रिब्यूट पोस्ट डेटा को सत्यापित करने के लिए

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult ClientLogin(FormCollection collection) 
{ 
    if(Client.validate(collection["username"], collection["password"])) 
    { 
     Session["username"] = collection["username"]; 
     Session["password"] = collection["password"]; 
     return View("valid"); 
    } 
    else 
    { 
     Session["username"] = ""; 
     Session["password"] = ""; 
     return View("invalid"); 
    } 
} 

कहाँ Client.Validate() एक विधि है कि पोस्ट यूज़रनेम और पासवर्ड

लेकिन मैं पर उपलब्ध कराई गई जानकारी के आधार पर एक बूलियन देता है मेरे दिमाग को बदल दिया और मैं विधि की शुरुआत में उस अच्छा एक्शनफिल्टर एट्रिब्यूट्स का उपयोग करना चाहूंगा ताकि क्लाइंट.विलिडेट() सही हो, बस [अधिकृत] जैसा ही हो, लेकिन मेरे कस्टम webservice के साथ, तो यह केवल प्रस्तुत किया जाएगा, इसलिए मैं कुछ ऐसा है:

[AcceptVerbs(HttpVerbs.Post)] 
[ValidateAsClient(username=postedUsername,password=postedPassword)] 
//Pass Posted username and password to ValidateAsClient Class 
//If returns true render the view 
public ActionResult ClientLogin() 
{ 
    return View('valid') 
} 

और फिर ValidateAsClient अंदर मैं की तरह कुछ होगा:

public class ValidateAsClient : ActionFilterAttribute 
{ 
    public string username { get; set; } 
    public string password { get; set; } 

    public Boolean ValidateAsClient() 
    { 
     return Client.validate(username,password); 
    } 
} 

तो मेरी समस्या है, मैं वास्तव में नहीं जानता कि यह काम करने के लिए कैसे, क्योंकि मैं कैसे पोस्ट जानकारी पारित करने के लिए पता नहीं है [ValidateAsClient (username = postUsername, password = postPassword)] और साथ ही, मैं फ़ंक्शन ValidateAsClient को ठीक से कैसे काम कर सकता हूं?

मुझे आशा है कि इस अग्रिम

उत्तर

7

यह शायद तरह

[ValidateAsClient(HttpContext.Request.Form)] 
+10

मुझे लगता है कि आप इसे पारित करने के बजाय 'filterContext.HttpContext.Request.Form' के साथ फ़ॉर्म संग्रह तक पहुंच सकते हैं। –

+0

हेवीवेव के लिए धन्यवाद बहुत अच्छा, एक और सवाल: क्या इस मामले में ActionExecutingContext और ActionExecutedContext का उपयोग करने में कोई अंतर है? धन्यवाद – zanona

+0

ActionExecutedContext को OnActionExecuted विधि में उपयोग किया जाना चाहिए, जो नियंत्रक की क्रिया विधि के बाद निष्पादित होता है। तो ActionExecutedContext में आपके पास निष्पादन के कुछ परिणामों तक पहुंच है। IntelliSense के साथ बस इसके साथ खेलते हैं। –

5

आप निम्न विधि ओवरराइड करना चाहिए धन्यवाद समझने में आसान है।

public override void OnActionExecuting(ActionExecutingContext context) 

और संदर्भ वस्तु से, अपने पोस्ट डेटा तक पहुंचें।

+0

ActionExecutingContext.RequestContext.HttpContext.Request.Form जांचें, और आप वहां पोस्ट मान को पकड़ने में सक्षम होना चाहिए। –

1

मैं एएसपी.नेट एमवीसी में कस्टम बाइंडर के साथ इस समस्या को हल करूंगा।

मान लीजिए कि आपके कार्य में निम्नलिखित हस्ताक्षर होंगे।

public ActionResult MyAction(MyParameter param) 
{ 
    if(param.isValid) 
    return View("valid"); 
    else 
    return View("invalid"); 
} 

MyParam वर्ग: इस तरह

[AttributeUsage(AttributeTargets.All)] 
public sealed class ValidateAsClientAttribute : ActionFilterAttribute 
{ 
    private readonly NameValueCollection formData; 
    public NameValueCollection FormData{ get { return formData; } } 

    public ValidateAsClientAttribute (NameValueCollection formData) 
    { 
     this.formData = formData; 
    } 

    public override void OnActionExecuting 
       (ActionExecutingContext filterContext) 
    { 
     string username = formData["username"]; 
     if (string.IsNullOrEmpty(username)) 
     { 
      filterContext.Controller.ViewData.ModelState.AddModelError("username"); 
     } 
     // you get the idea 
    } 
} 

और इसका इस्तेमाल करते हैं:

public class MyParameter 
    { 
     public string UserName{get;set;} 
     public string Password {get;set;} 

     public bool isValid 
     { 
     //check if password and username is valid. 
     } 

} 

एक तो कस्टम बांधने की मशीन

public class CustomBinder:IModelBinder 
{ 
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      var p = new MyParam(); 
      // extract necessary data from the bindingcontext like 
      p.UserName = bindingContext.ValueProvider["username"] != null 
         ? bindingContext.ValueProvider["username"].AttemptedValue 
         : ""; 
      //initialize other attributes. 
     } 
} 
+0

यह एक साधारण काम के लिए एक ओवर डिजाइन है। @ हेवीवेव ने एक उत्कृष्ट और सरल समाधान प्रदान किया। – reflog

+0

टीएसएस ... मैं इसे करने के अन्य तरीकों को सरल नहीं जानता :)। –

3

मुझे नहीं लगता कि इस मामले में ActionFilterAttribute का उपयोग करना एक अच्छा विचार है। और आप जो करना चाहते हैं वह निश्चित रूप से Authorize विशेषता जैसा नहीं है।

Authorize विशेषता केवल एक नियंत्रक/क्रिया में एक सामान्य तर्क इंजेक्ट करता है। जो है:

लॉगिन पृष्ठ पर रीडायरेक्ट करें, यदि उपयोगकर्ता लॉग इन नहीं है। अन्यथा कार्रवाई को निष्पादित करने दें।

आपकी ClientLogin कार्रवाई इस समय क्या करना है।
यह तर्क उस तर्क को ActionFilterAttribute पर ले जाने के लिए एक खराब डिज़ाइन होगा।

+0

आप सही हैं, ऐसा कुछ अच्छा नहीं है जो किसी एक क्रिया द्वारा केवल एक क्रिया में उपयोग किया जाना चाहिए। प्राधिकरण इंगित करता है कि कार्रवाई के लिए उपयोगकर्ता को अधिकृत होना आवश्यक है, इसमें कोई तर्क नहीं है। –

+0

हां, मैं आपको समझता हूं, वास्तव में समस्या यह है कि मेरे पास पूरे ऐप पर क्लाइंट द्वारा कुछ अलग-अलग कार्रवाइयां की जाएंगी, और इसके लिए क्लाइंट को लॉग इन करने की आवश्यकता होगी अन्यथा यह उसे रीडायरेक्ट कर देगा लॉगिन वाला पन्ना। तो मैं सोच रहा था कि यह बहुत आसान और सुंदर हो सकता है (जैसा कि मैं अब से कह सकता हूं क्योंकि मैं एएसपी.NET पर शुरू हुआ हूं, इसलिए कुछ भी गलत तरीके से खेद है) प्रत्येक विधि की शुरुआत में [ValidateAsClient] डालने के लिए । लेकिन मुझे यकीन नहीं है कि यह सही है, आपके इनपुट – zanona

+0

के लिए धन्यवाद, ठीक है, यह आपके रास्ते को करने के लिए कुछ भी नहीं तोड़ देगा। :) इस तरह की विशेषता का उपयोग करने के लिए पूरी तरह से प्राकृतिक नहीं है। बस इतना ही। –

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