0

これが私のシナリオです:

GenericPrincipal に渡すカスタム IIdentity を正常に作成しました。コントローラーでその IIdentity にアクセスするときは、カスタム プロパティを使用するために IIdentity をキャストする必要があります。例:

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

ほとんどすべてのアクションに対してこのキャストを行う必要があるため、この機能を ActionFilterAttribute にラップしたいと考えています。コンテキストがまだ初期化されていないため、コントローラーのコンストラクターでは実行できません。私の考えでは、ActionFilterAttribute に、各アクション メソッドで使用できるコントローラーのプライベート プロパティを設定させることです。例:

public class TestController : Controller
{
    private MyCustomIdentity identity;

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

質問: これはどのように可能ですか? より良い解決策はありますか?属性に設定されているパブリック プロパティをコントローラーに渡す方法を見つけようとして頭を悩ませましたが、取得できません。

4

2 に答える 2

1

カスタムモデルバインダーを使用できます...

@jfar が言及しているベースコントローラーメソッド (これも良いオプションです) よりもこのメソッドを使用した理由を思い出せませんが、私にとってはうまく機能し、私のアクションはパラメーターを通じてより自己記述的であるため、実際にはちょっと気に入っています。

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

Global.asax.cs のアプリケーション開始イベント内

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

次にMyCustomIdentity、アクション パラメーターとして のタイプがある場合は常に、自動的にMyCustomIdentityModelBinder.

例えば。

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

HTH、
チャールズ

于 2010-04-07T04:55:33.480 に答える
1

オーバーロードされた OnActionExecuting() メソッドの ActionExecutingContext にアクセスし、ID をプライベートではなくパブリックにして、actionfilter がアクセスできるようにするだけです。

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



        base.OnActionExecuting(filterContext);
    }
}

これは、すべてのコントローラーが継承するカスタム基本コントローラー クラスを使用することで、さらに簡単になる可能性があります。

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

その後:

public class TestController : MyCustomController
{
    public ActionResult()
    {
        int userID = Identity.UserId
        ...etc...
    }
}
于 2010-04-07T03:20:08.170 に答える