Vra

Hier is my scenario:

Ek het suksesvol 'n persoonlike IIdentity dat ek slaag om 'n GenericPrincipal. Toe ek toegang wat IIdentity in my kontroleerder Ek moet die IIdentity werp om die persoonlike eienskappe te gebruik. Byvoorbeeld:

public ActionResult Test()
{
    MyCustomIdentity identity = (MyCustomIdentity)User.Identity;
    int userID = identity.UserID;
    ...etc...
}

Sedert ek nodig het om hierdie beslissende doen vir byna elke aksie wil ek hierdie funksie draai in 'n ActionFilterAttribute. Ek kan dit nie doen in constructor die beheerder se omdat die konteks nog geïnisialiseer. My gedagte sou wees om die ActionFilterAttribute invul het 'n private eiendom op die kontroles wat ek kan gebruik in elke aksie metode. Byvoorbeeld:

public class TestController : Controller
{
    private MyCustomIdentity identity;

    [CastCustomIdentity]
    public ActionResult()
    {
        int userID = identity.UserID;
        ...etc...
    }
}

Vraag: Is dit moontlik en hoe? Is daar 'n beter oplossing? Ek het my brein geteisterd probeer om uit te vind hoe om openbare eienskappe wat bevolk in 'n kenmerk van die beheerder te slaag en ek kan dit nie kry nie.

Was dit nuttig?

Oplossing

Al wat jy hoef te doen, is toegang die ActionExecutingContext van 'n oorlaaide OnActionExecuting () metode en maak identiteit openbaar in plaas van private so jou actionfilter dit kan oopmaak.

public class CastCustomIdentity : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ((TestController) filterContext.Controller).Identity = (MyCustomIdentity)filterContext.HttpContext.User;



        base.OnActionExecuting(filterContext);
    }
}

Dit kan selfs makliker deur die gebruik van 'n persoonlike basis kontroleerder klas wat al jou leiers sou erf wees

public class MyCustomController
{
    protected MyCustomIdentity Identity { get{ return (MyCustomIdentity)User.Identity; } }
}

en dan:

public class TestController : MyCustomController
{
    public ActionResult()
    {
        int userID = Identity.UserId
        ...etc...
    }
}

Ander wenke

Jy kan 'n persoonlike model band ...

gebruik

Ek kan nie onthou hoekom ek hierdie metode gebruik oor die basis kontroleerder metode @jfar noem (wat ook 'n goeie opsie), maar dit werk goed vir my en ek eintlik kinda soos dit omdat my dade is meer self beskryf deur hul parameters.

MyCustomIdentityModelBinder.cs

public class MyCustomIdentityModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.Model != null)
            throw new InvalidOperationException("Cannot update instances");

        //If the user isn't logged in, return null
        if (!controllerContext.HttpContext.User.Identity.IsAuthenticated)
            return null;

        return controllerContext.HttpContext.User as MyCustomIdentity;
    }
}

In jou aansoek begin gebeurtenis in Global.asax.cs

System.Web.Mvc.ModelBinders.Binders.Add(typeof(MyCustomIdentity), new MyCustomIdentityModelBinder());

Toe wanneer jy 'n tipe van MyCustomIdentity as 'n aksie parameter, dit sal outomaties gebruik die MyCustomIdentityModelBinder.

Bv.

public class TestController : Controller
{
    public ActionResult Index(MyCustomIdentity identity)
    {
        int userID = identity.UserID;
        ...etc...
    }
}

HTHs, Woordeboek Charles

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top