سؤال

والواقع لدي التطبيق الذي يستخدم خدمة ويب لاسترداد بعض المعلومات العملاء. لذلك كان التحقق من صحة معلومات تسجيل الدخول داخل 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 () هو أسلوب يقوم بإرجاع منطقية استنادا إلى المعلومات المتوفرة على اسم المستخدم وكلمة المرور وظيفة

ولكن غيرت رأيي وأود أن استخدام هذا ActionFilterAttributes لطيفة في بداية طريقة لذلك سوف يكون مجرد صدوره إذا كان Client.validate () العودة الحقيقية، تماما نفس [تخويل] ولكن مع عادتي خدمة ويب، لذلك أود أن يكون شيئا مثل:

[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 (اسم المستخدم = postedUsername، كلمة المرور = postedPassword)] و أيضا، كيف يمكن أن تجعل من عمل وظيفة ValidateAsClient صحيح؟

وآمل أن يكون هذا من السهل أن نفهم شكرا مقدما

هل كانت مفيدة؟

المحلول

وشيء من هذا القبيل ربما:

[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
    }
}

واستخدامها مثل هذا:

[ValidateAsClient(HttpContext.Request.Form)]

نصائح أخرى

ويجب تجاوز الأسلوب التالي.

public override void OnActionExecuting(ActionExecutingContext context)

ومن الكائن السياق، الوصول إلى البيانات مشاركتك.

وأنا لا أعتقد انها فكرة جيدة لاستخدام ActionFilterAttribute في هذه الحالة. وما تريد القيام به هو بالتأكيد ليست نفس السمة Authorize لا.

والسمة Authorize فقط بحقن منطق مشترك في وحدة تحكم / العمل. وهو:

<اقتباس فقرة>   

وإعادة توجيه إلى صفحة تسجيل الدخول، إذا لم يتم تسجيل المستخدم في. عدا ذلك دعونا يتم تنفيذ العمل.

والعمل ClientLogin ديك يفعل ذلك بالضبط ما يفترض القيام به في الوقت الراهن.
وسيكون تصميم سيء لتنفيذ هذا المنطق على لActionFilterAttribute.

وأود أن حل هذه المشكلة مع الموثق مخصصة في ASP.NET MVC.

لنفترض أن لديك عمل توقيع التالية.

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

والطبقة MyParam:

    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.
        }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top