2009-06-11 3 views
2

プロジェクトにASP.NET MVCを使用しています。私は多くのユーザーコントロールを使用し、現在のユーザーとそれが役割などを持っているかどうかを確認する必要があります。これで、すべてのユーザーコントロールでユーザーを作成します。私はそれを変更したいので、私は一度だけそれを作成します。asp.NET MVCの現在のユーザーを取得して、ユーザーコントロールで何をするかを確認できます。

質問はWhtaが最高のaprochですか? viewData ["User"] = userここでユーザーフォームを取得しますか?あなたは何をお勧めしますか?私はこの行を取り除くことができます

LCP.eTorneos.Dal.EntityFramework.JugadorRepository jugadorRepository = 
        new LCP.eTorneos.Dal.EntityFramework.JugadorRepository(); 
var jugador = jugadorRepository.GetJugador(User.Identity.Name) 
<% if (Page.User.Identity.IsAuthenticated && jugador.IsAdmin) { %> 
     ... 
<%}%> 

答えて

1

私は信じて、このような何か:

<%= Utils.GetJugador(ViewData).IsAdmin %> 

はこれよりはるかに優れています:拡張子のみHTMLマークアップを生成するためのものである

<%= Html.GetJugador().IsAdmin %> 

HtmlHelperのため

UPDATE:

using System.Web.Mvc; 
using LCP.eTorneos.Dal.EntityFramework; 

public static class Utils { 
    public static Jugador GetJugador(ViewDataDictionary ViewData) { 
     return ViewData["JugadorActual"] as Jugador; 
     /* OR maybe ? 
     * return (Jugador)(ViewData["JugadorActual"] ?? new Jugador()); 
     */ 
    } 
} 

希望これは

3

2つのオプションがあります。まず、ViewData ["User"]を使用します。最もシンプルですが、強く型付けされたものではありません。第二に、すべてのビューモデルのベースビューモデルを使用して、(あなたがビューモデルを使用している場合):コントローラで

public class BaseViewModel { 
    public Jugador Jugador; 

    // Or simply add flag 

    public IsAdmin; 
} 

public class ConcreteViewModel : BaseViewModel { 
    public YourModel Model; 
} 

:ビューに

var model = new ConcreteViewModel { 
    Model = yourModel, 
    IsAdmin = true /* false */ 
}; 

return View(model); 

<%@ Page MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ConcreteViewModel>" %> 

<!-- Or in SiteMaster: --> 

<%@ Master Inherits="System.Web.Mvc.ViewMasterPage<BaseViewModel>" %> 

<% if(Model.IsAdmin) { %> 

... 

<% } %> 

更新:

コードを複製しないようにしてください。

public class IsAdminAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // ... 

     (filterContext.Controller.ViewData.Model as BaseViewModel).IsAdmin = true; /* flase */ 
    } 
} 
+0

これが機能するのに役立ちますが、あなた本当にすべてのコントローラに役割が設定されるようにしなければならない。一度それが行われないと、その値は要求から取られます。それはフィルタでそれを持っていいです。 –

+0

良い点、私は答えを更新する –

+0

@ eu-ge-neこれは正しい方向だと理解していますが、質問があります。このフィルタはコントローラにあります。たとえば、リンクを表示するかどうかを決定しますか? –

1

まずはThanks @ eu-ge-ne。

この私がやったことを、私は、私は新しい提案を開いていますが、これは動作しているようです: 私はこのようなActionFilterAttributeを作成します。

public class JugadorAttribute : ActionFilterAttribute { 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { 
     JugadorRepository jugadorRepository = new JugadorRepository(); 
     Jugador jug = jugadorRepository.GetJugador(filterContext.HttpContext.User.Identity.Name); 
     filterContext.Controller.ViewData["JugadorActual"] = jug; 
    } 
} 

このプットのViewData中のページの現在のプレーヤー。

[JugadorAttribute()] 
public class HomeController : Controller { 

私は、HTMLクラスでこのヘルパーを作成するので、問題は今のViewDataが強く型付けされていないということです::

public static class JugadorHelper { 
    public static Jugador GetJugador(this HtmlHelper html) { 
     return ((LCP.eTorneos.Dal.EntityFramework.Jugador)html.ViewData["JugadorActual"]); 
    } 
} 

そしてWhoala、今、私はこれを行うことができますそして、私のコントローラで、私はこれを行います私の意見で:

Html.GetJugador().IsAdmin 
+0

提案が1つあります。私はHtmlHelperがGetJugador拡張(HtmlHelper拡張はHTMLマークアップを作成することのみを扱う)のための適切な場所ではないと思います。 Jugador GetJugador(ViewDataDictionary ViewData){戻るViewData ["JugadorActual"]をJugadorとして返します。 }。 –