2009-06-27 9 views
1

ASP.NET MVCでさまざまなセキュリティレベルのユーザーのさまざまなセクションを表示するWebサイトを開発しています。本質的には、ビューは同じですが、セキュリティレベルが高いユーザーは、管理者などのセキュリティレベル以上のユーザーには見えないセクションを表示できる必要があります。オブジェクト指向のさまざまなビューセクションを表示する方法

私はオブジェクト指向の方法でこれを行う方法がわかりません。これは継承で行うことができると思いますが、継承を実装する方法はわかりません。

はまた、私は

<% if (User has some security level) { %> 
    <span>show this info</span> 
<% } %> 

のようなものをやって、IFSの多くをコーディングすることができます知っているが、これはうまく香りがしません。実際には、オブジェクト指向の原則やデザインをこのタスクに使用する方法がわかりません。

私はこれが一般的な作業だと思うので、このタスクを達成するパターンがあると思います。たとえば、Stackoverflowは、質問(または回答またはコメント)を投稿し、他のすべてのユーザーに同じオプションを表示しないユーザーに対していくつかのオプション(編集、削除など)を表示するときにこれを行います。

答えて

0

あなたがやっている作業の複雑さによっては、if文のルートで十分です。そうでない場合、部分的なビューを使用して見て、特定の役割に基づいて部分的なレンダリングを可能にするHtmlHelper拡張機能を記述することができます。 、強く型付けされたビューを使用して

<% Html.RenderPartialWithRole("AdminSection", 
           Model, 
           ViewData, 
           User, 
           "Administrator", 
           null) %> 


public static void RenderPartialWithRole(this HtmlHelper helper, 
              string partialName, 
              object model, 
              ViewDataDictionary viewData, 
              IPrincipal user, 
              string role, 
              object htmlAttributes) 
{ 
    if (user != null && !string.IsNullOrEmpty(role) && user.IsInRole(role)) 
    { 
      helper.RenderPartial(partialName, model, viewData, htmlAttributes); 
    } 
} 
0

ShowSection(セクションごとに1、あなたのcontrollorに設定するロジック)のようなモデルのブール型プロパティを持っている:それは次のようになります。 divタグのセクションを良いIDで持ってください。次に、JavaScriptまたはjqueryを使用して、divタグの表示スタイルをBooleanプロパティに基づいて設定します。

+0

これはオブジェクト指向されていない場合、およびユーザーがJavaScriptを無効にしても動作しない – eKek0

+0

私はeKek0に同意します。加えて、ビューはロジックが何もないはずがないという私の強い信念です。言い換えれば、ビューに埋め込まれたコードは、循環的複雑度1を持つ必要があります。すなわち「if」文はない。 –

+0

私はあなたがあまりにもそれをやることに心配していると思う - あなたのビューはダムでなければならず、すべてのロジックがコントローラにあり、モデルを通して必要な情報を渡すだけです –

0

異なるパーミッションレベルで使用可能なセクションを含むようにビューが構築され、パーシャルのすべてのセクションを持つことができます。 1つは管理者用、1つはすべてのレベル用です。コントローラには、使用するビューを決定するロジックがあります。つまり、OOの部分はコントローラにあり、ビューにはありません。

0

これはオブジェクト指向のアプローチではありませんが、関連しています。この質問の興味深い部分はif文の乗り方です。 ifまたはcaseを取り除く通常の方法は、基準と効果のルックアップテーブルを使用することです。データ指向プログラミング(http://en.wikipedia.org/wiki/Data-directed___programming)やディスパッチテーブル(http://en.wikipedia.org/wiki/Dispatch_table)など、この同じアイデアを使用する他の手法もあります。多くの言語実装では、型ディスパッチテーブルを使用して仮想メソッド呼び出しを実装しています。

この問題では部分的なビューが問題ないと仮定すると、ルックアップテーブルはペアのリストになる可能性があります。ペアの最初の要素は、現在のユーザーと照合するロール名です。ペアの2番目の要素は、ロールチェックが成功したときにレンダリングする部分ビューの名前です。

我々は、コントローラ(またはwhereever)のテーブルを初期化した後、正しい部分的なビューを選択し、レンダリングするHtml.RenderViewByRoleを使用し、ViewDataをに代入:

<% Html.RenderPartialByRole(User, (List<Dispatch>)ViewData["rolePartial"]); %> 

public static class MyHelper { 
    public static void RenderPartialByRole(this HtmlHelper helper, IPrincipal user, List<Dispatch> rolePartial) { 
     foreach (Dispatch d in rolePartial) { 
      if (d.CheckRole(user)) { 
       helper.RenderPartial(d.PartialName); 
       break; 
      } 
     } 
    } 
} 

public class Dispatch { 
    string _roleName; 
    string _partialName; 

    public Dispatch(string roleName, string partialName) { 
     _roleName = roleName; 
     _partialName = partialName; 
    } 
    public bool CheckRole(IPrincipal user) { 
     return user.IsInRole(_roleName); 
    } 
    public string PartialName { 
     get { return _partialName; } 
    } 
} 

public class HomeController : Controller { 

    List<Dispatch> rolePartial = new List<Dispatch>(); 
    private void InitTable() { 
     rolePartial.Add(new Dispatch("admin", "adminPartial")); 
     rolePartial.Add(new Dispatch("report", "reportPartial")); 
     rolePartial.Add(new Dispatch("guest", "guestPartial")); 
    } 

    public HomeController() { 
     InitTable(); 
    } 

    public ActionResult Index() { 
     ViewData["rolePartial"] = rolePartial; 
     return View(); 
    } 
} 
関連する問題