0

私はasp.net mvcで新しくなっています。私は、ビューページにロールワイズ動的メニューショーを構築しようとしています。各ユーザーは複数の役割を持つことができます。 私のような結合問合せがあります。asp.net mvcのマスターレイアウトページからjoinクエリデータを格納してforeachループを使用して取得する方法

私のコントローラが参加するクエリで次のようになります。

var query= (from rMPageMap in db.RoleModulePageMaps 
           join userRole in db.UserRoleMaps 
           on rMPageMap.RoleId equals 
           join roleMaster in db.RoleMasters 
           on rMPageMap.RoleId equals roleMaster.Id 
           join modMaster in db.ModuleMaster 
           on rMPageMap.ModuleId equals modMaster.Id 
           join sModMaster in db.SubModuleMasters 
          on rMPageMap.SubModuleId equals sModMaster.Id 
           join pMaster in db.PageMasters 
           on rMPageMap.PageId equals pMaster.Id 
           where (userRole.UserId == appuser.Id &) 
           select new 
           { 

            rMPageMap.RoleId, 
            rMPageMap.PageMaster.Name, 
            roleMaster.Id, 
            roleName = roleMaster.Name, 
            modId = modMaster.Id, 
            moduleName = modMaster.Name, 
            subModuleId = sModMaster.Id, 
            subModuleName = sModMaster.Name, 
            pageId = pMaster.Id, 
            pageName = pMaster.Name, 
            parentPageId = pMaster.ParentPageId, 
            rMPageMap.AddData, 
            rMPageMap.EditData, 
            rMPageMap.ViewData, 
            rMPageMap.DeleteData, 
            rMPageMap.ShowInDashBoard, 
            rMPageMap.ShowInMenu 
           }); 
Session["rolemodulepage"] = query; 

デバッグ中に私がセッション内の値を見つけることを。しかし、私はレイアウトページでforeachループを使用してこれからデータを取得することはできません。 ここでは私の検索ページを見ていますが、検索はできますが動作しません。

閲覧ページ:

@if (Request.IsAuthenticated) 
    { 
    var sessionVar = System.Web.HttpContext.Current.Session["rolemodulepage"]; 

    foreach(var i in sessionVar) // error 
    { 
     @i.... // error 
    } 
// So here how to retrieve data from session using foreach loop. I tried but does not work. Pls help. If you have some resource for dynamically mane show in view page pls share with me. 

誰がどのようにマスターレイアウトページ内の役割ベースのユーザーによる動的なメニューを示す使用してそれを実行することを説明することができます。 Wihoutログインはサイトに入ることはできません、plsは私が理解できるように例を説明します。前もって感謝します。

+0

ビューで使用できない匿名オブジェクトのコレクションを生成しています。ビューモデルを作成し、そのモデルをビューに渡します。 –

+0

私を助けることができます...それを行う方法???または任意のヒント。 – user267019

+0

これらの各プロパティを持つクラスを作成し、 'select new yourModel {RoleId = rMPageMap.RoleId、.....'など(あなたのモデルは 'IEnumerable 'となります) –

答えて

1

クエリでは、ビューでアクセスできない匿名オブジェクトのコレクションが生成されています。あなたが必要とするプロパティを含むビューモデルを作成し、そこにクエリを投影し、例えば

public class MenuVM 
{ 
    public int RoleId { get; set; } 
    public string PageMasterName { get; set; } 
    .... 
} 

、その後

var query = (from rMPageMap in db.RoleModulePageMaps 
      .... 
      where (userRole.UserId == appuser.Id &) 
      select(new MenuVM() 
      { 
       RoleId = rMPageMap.RoleId, 
       PageMasterName = rMPageMap.PageMaster.Name, 
       .... 
      }).AsEnumerable() 

にクエリを変更。

、その後ビューで、あなたはしかし、それを介して

var sessionVar = HttpContext.Current.Session["rolemodulepage"] as IEnumerable<MenuVM>; 
if (sessionVar null) 
{ 
    foreach(var i in sessionVar) 
    { 
     .... 

Session値とループをキャストすることができ、これはレイアウトのメニューを生成するためのものであるとして、私はあなたが子アクションにコードを移動作成示唆CommonController

[ChildActionOnly] 
public PartialViewResult Menu() 
{ 
    if (!Request.IsAuthenticated) 
    { 
     return null; 
    } 
    // Check if the session variable exists and if not, generate the query 
    // and add the result to session 
    return PartialView("_Menu", query); 
} 

言うには、たとえば、強く型付けされた部分ビューを返し、_Menu.cshtmlビューは次のようになり唯一の方法

@model IEnumerable<MenuVM> 
@foreach (var i in Model) 
{ 
    .... 
} 

とレイアウトでは、メニューのHTMLを生成するために

@{ Html.RenderAction("Menu", "Common"); } 

を使用しています。

+0

ありがとう@Stephen Mueche、私が試した最初の方法とそれはうまく動作し、私は2番目の方法を適用する.....もう一度感謝... – user267019

関連する問題