3

そのため、当面の間、さまざまなビューにリンクする一般的なアクション結果がいくつかあります。レイアウト ページには、ページごとに必要なログイン ユーザー名を設定するための adfs への呼び出しが含まれています。次のようになります。

            <div class="float-right">
                <section id="login">
                   Hello, <span class="username">@ViewBag.GivenName @ViewBag.LastName</span>!
                </section>
            </div>

ホームコントローラーで、このログイン名が機能するのは、次のコードです。

    public ActionResult Index()
    {
        ClaimsIdentity claimsIdentity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;
        Claim claimGivenName = claimsIdentity.FindFirst("http://sts.msft.net/user/FirstName");
        Claim claimLastName = claimsIdentity.FindFirst("http://sts.msft.net/user/LastName");

        if (claimGivenName == null || claimLastName == null)
        {
            ViewBag.GivenName = "#FAIL";
        }
        else
        {
            ViewBag.GivenName = claimGivenName.Value;
            ViewBag.LastName = claimLastName.Value;
        }


        return View();
    }

しかし、前述のように、ユーザーが各リンク (actionresult) に移動したときにこれを表示する必要があります。したがって、これを実現するには、上記のすべてのコードを各 actionresult に投稿する必要があります。

あるアクションから別のアクションにコードを複製するのではなく、これを各アクション結果全体に適用する方法はありますか? _Layout.cshtml の actionresult に登録して、そのパーシャルビューを呼び出そうとしましたが、好ましい結果は得られませんでした。私が見逃しているのは単純なものだと確信しています。

あなたの何人かが助けてくれることを願っています。どうもありがとう。

4

3 に答える 3

1

抽象コントローラーを使用し、そのOnActionExecutingメソッドをオーバーライドして、実際のアクション メソッドが呼び出される前にコードを実行します。この抽象コントローラーを使用すると、他のコントローラーを継承させてその機能を取得するだけで済みます。また、この基本コントローラーを、それを拡張する他のコントローラーが使用できる他のヘルパー メソッド ( など) を定義する場所として使用しますGetUsernameForAuthenticatedUser()

public abstract class AbstractAuthenticationController : Controller
{
    private readonly IAuthenticationService _authService;

    protected AbstractAuthenticationController()
    {
        _authService = AuthenticationServiceFactory.Create();
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        EnsureUserIsAuthenticated();
    }

    internal void EnsureUserIsAuthenticated()
    {
        if (!_authService.IsUserAuthenticated())
        {
            _authService.Login();
        }
    }

    protected string GetUsernameForAuthenticatedUser()
    {
        var identityName = System.Web.HttpContext.Current.User.Identity.Name;
        var username = _authService.GetUsername(identityName);
        if (username == null) throw new UsernameNotFoundException("No Username for " + identityName);
        return username;
    }
}

この機能は、Attribute継承を使用するのではなく、コントローラーを装飾できるクラスに実装することもできますが、最終結果は同じです。カスタム コントローラー属性の実装の例を次に示します

于 2013-03-19T22:32:33.020 に答える
0

基本コントローラーを作成し、すべてのコントローラーをそれから継承させることができます。名と姓を設定するコードを別の保護されたメソッドに移動し、必要なときにいつでも呼び出します。Initializeベースコントローラーのメソッドで関数を呼び出すことができると思います。これにより、アクションに直接呼び出す必要がなくなります。を操作する代わりに、モデルの階層を作成し、ベース モデルのプロパティとしてGivenNameとを使用することもできます。LastNameViewBag

于 2013-03-19T22:14:45.553 に答える
0

これはテンプレートのセット部分のためだけに使用するための別OnActionExecutingの方法は、パーシャルを返す独自のアクション メソッドを指定して呼び出すことです。@Html.Action()

于 2013-03-20T10:24:46.443 に答える