2013-01-03 161 views
1

我對JQgrid和mvc3很新。我有一個非常基本的具有編輯功能的jQgrid。MVC3 AD JQGrid基於角色的授權編輯鏈接

我想在jqGrid.navgrid中爲某些用戶(通過AD進行身份驗證)禁用編輯鏈接,當JqGrid加載併爲其他用戶角色不同時啓用它。

我能夠限制用戶編輯網格數據,但這還不夠。我希望用戶不要在JqGrid中看到那個可編輯鏈接。

這裏是其中的jqGrid我在我的視圖(index.cshtml):

jQuery(document).ready(function() { 
      jQuery('#list').jqGrid({ 
      colNames: ['id', 'CountryCode','Node','EligFactor'], 
      colModel: [ 
         { name: 'id', index: 'id', width: 150, height: 100, align: 'left' }, 
         { name: 'CountryCode', index: 'CountryCode', width: 150, align: 'left' }, 
         {name: 'Node', index: 'Node', width: 150, height: 100, align: 'left' }, 
         {name: 'EligFactor', index: 'EligFactor', width: 150, height: 100, align: 'left', editable: true, edittype: 'text' } 
         ], 
      url: '@Url.Action("DynamicGridData")', 
      datatype: 'json', 
      mtype: 'POST', 
      pager: jQuery('#pager'), 
      rowNum: 10, 
      rowList: [5, 10, 15, 20, 25], 
      sortname: 'Id', 
      sortorder: "asc", 
      viewrecords: true, 
      imgpath: '', 
      caption: 'Eligibility Factor Grid', 
      imgpath: '/Content/images', 
      height: '210px' 

      }).navGrid('#pager', { edit: true, add: false, del: false, search: false, refresh: true }, 
       { url: '@Url.Action("EditRecord")', closeAfterEdit: true }, 
       {}, 

       {}); 
     }); 

2,這裏是在控制器中的編輯方法當用戶嘗試編輯該網格數據正在使用:

 [Authorize([email protected]"MyDomain\SecurityLists\User1")] 
     public ActionResult EditRecord(int id, string eligFactor) 
     { 
      bool success = false; 
      var context = new EligibilityFactorDataContext(); 
      EligibilityControl eg = context.EligibilityControls.Single(p => p.id == id); 

      eg.EligFactor = Convert.ToSingle(eligFactor); 

      try 
      { 
       context.SubmitChanges(); 
       success = true; 
       return Json(success); 
      } 
      catch (Exception e) 
      { 
       success = false; 
       return Json(success); 
          } 

     } 

可以有人pl。幫助我實現這一目標。非常感激 !

var context = new EligibilityFactorDataContext(); 


      var isAuth = true; 
      int pageIndex = Convert.ToInt32(page) - 1; 
      int pageSize = rows; 
      int totalRecords = context.EligibilityControls.Count(); 
      int totalPages = (int)Math.Ceiling((float)totalRecords/(float)pageSize); 
      var eligibilitycontrols = context.EligibilityControls.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize); 
      var jsonData = new 
      { 
       total = totalPages, 
       page = page, 
       records = totalRecords, 
       userdata = isAuth, 
       rows = (
         from eligibilitycontrol in eligibilitycontrols 
         select new 
         { 
         id = eligibilitycontrol.id, 
         cell = new string[] { 
               eligibilitycontrol.id.ToString() , 
               eligibilitycontrol.CountryCode, 
               eligibilitycontrol.Node.ToString(), 
               Convert.ToSingle(eligibilitycontrol.EligFactor).ToString()} 

              }).ToArray() 
      }; 
      return Json(jsonData); 
    } 

回答

2

添加一個檢查,如果用戶進行身份驗證,如果用戶進行身份驗證或通過在您的視圖模型一個布爾值,以你的觀點不和修改在此基礎上的資產淨值尋呼機。

防爆

var userIsAuth = '@Model.UserIsAuth' == 'true'; 
jQuery('#list').jqGrid().navGrid('#pager', { edit: (userIsAuth ? true : false), add: false, del: false, search: false, refresh: true }, 
     { url: '@Url.Action("EditRecord")', closeAfterEdit: true }, 
     {},  
     {}); 

所以在控制器,你需要以類似的方式來定義的UserData防爆

userdata = new {ExampleName = ExampleValue}, 

然後在您的loadComplete:()函數

var myPassedUserData = $(this).getGridParam('userData'); 
var ExampleVariable = myPassedUserData.ExampleName 

編輯 - 使用三進制操作來簡化代碼。可能url:屬性也可以通過userIsAuth布爾被禁用。

+0

馬克,感謝您的評論。首先,我沒有這樣的Jqgrid()..我有一堆參數:價值在裏面..如果我像你所說的使用..許多鱈魚重複..似乎不是很好的方式來做到這一點..甚至我不知道如何從我的控制器傳遞該參數..我試圖在我的DynamicGridData mehtod這樣的事情: – ana

+0

我在我的實際問題中添加DynamicGridData – ana

+0

我不明白你是什麼意思,你沒有這樣的jQgrid()?我上面所做的只是定義了導航區域的構建,與您聲明網格的地方分開。你可以很容易地將上面的代碼簡化成一個帶有三元運算符的語句,但我想保持清晰。如果你不知道如何將bool傳遞給你的View,我猜你可以通過jQgrid數據中的Userdata傳遞它。 – Mark