2014-10-22 4 views
0

현재 사이트 사용자의 권한과 권한이 DevExpress GridView 내에 표시되는 프로젝트에서 작업하고 있습니다. 사용자의 권한은 단순히 확인란입니다. 내가 겪고있는 문제는 체크 상자의 개체를 설정하는 것입니다.설정 확인란을 사용하지 않도록 설정했습니다.

원래 사이트는 하나의 엔티티 (즉, 사무실)에서만 사용되었습니다. 제 목표는 여러 사무실에서 사용하는 것입니다. 이를 위해 필자는 각 사무실을 기반으로 사용자 권한을 설정할 수 있도록 사무실 간을 전환하는 드롭 다운을 만들었습니다. 그러나 각 사무실에는 동일한 사용 권한 목록이 없습니다.

Ex. 첫 번째 사무실은 사이트 (12 개 모듈)에 대한 전체 액세스 권한을가집니다 (원래 사무실). 두 번째 사무실은 사이트의 5 개 모듈에만 액세스 할 수 있습니다. 나는이 문제를 해결할 수있는 방법을 만들어 두 번째 사무실을위한 5 개의 모듈을 제외한 모든 것을 사용할 수 없도록했습니다.

개발 중에는이 기능을 처리하기 위해 만든 제품이 있습니다. 그러나 테스트 환경으로 옮겨 가면 작동이 멈 춥니 다. 내가 생각하는 문제는 두 개의 foreach 루프가 격자의 열 데이터와 함께 확인란 필드를 만드는 데 사용된다는 것입니다. 아래는 나의 솔루션을 만들기 위해 내가 한 일이다.

보기

foreach (var item in Model.Applications) 
     { 
      settings.Columns.AddBand(bnd => 
      { 
       bnd.Name = string.Format("{0}", item.Name); 
       bnd.Caption = item.Name + " Roles"; 

       foreach (var subitem in item.Roles) 
       { 
        bnd.Columns.Add(col => 
        { 
         col.Name = string.Format("{0}", subitem.Name); 
         col.FieldName = subitem.Name; 
         col.VisibleIndex = index; 
         col.Width = Unit.Pixel(75); 
         col.ColumnType = MVCxGridViewColumnType.CheckBox; 
         col.Caption = subitem.Description; 
         col.Settings.AllowAutoFilter = DefaultBoolean.False; 
         col.Settings.AllowHeaderFilter = DefaultBoolean.False; 
         col.Settings.AllowSort = DefaultBoolean.False; 

         col.SetDataItemTemplateContent(temp => 
         { 
         %> 
         <%=Html.CheckBox(
           string.Format("chk{0}{1}", col.Name, temp.KeyValue.ToString().Replace("-", "")), 
           (bool)DataBinder.Eval(temp.DataItem, col.Name), 
           SCCView.Areas.Admin.Models.ModifyPrivilegeModel.GetHtmlAttributes(bnd.Name, temp.KeyValue, col.Name, item.Name) 
           )%> 
         <% 
         }); 
        }); 
        index++; 
       } 
      }); 
     } 

모델 개발에

public static object GetHtmlAttributes(string bndName, object keyValue, string colName, string itemName) 
     { 
      //Check to see if SCNGO is being used 
      if (HttpContext.Current.Session["SCNGOAllowedApps"] != null) 
      { 
       //Check to see if that Application is within SCNGO currently 
       var scngoApps = (List<string>)HttpContext.Current.Session["SCNGOAllowedApps"]; 
       var app = scngoApps.Where(scngo => scngo == itemName).Select(scngo => scngo).FirstOrDefault(); 

       //App is not, so disable it 
       if (app == null) 
        return new 
        { 
         onClick = string.Format(@"CheckChanged(this, '{0}', '{1}', '{2}');", 
             bndName, 
             keyValue, 
             colName), 
         Class = "ModifyPrivChkBox", 
         disabled = "disabled" 
        }; 
      } 

      //SCC, or at the very least an app within SCNGO 
      return new 
      { 
       onClick = string.Format(@"CheckChanged(this, '{0}', '{1}', '{2}');", 
             bndName, 
             keyValue, 
             colName), 
       Class = "ModifyPrivChkBox" 
      }; 
     } 

이 확인란을 사용할 수 없습니다. 테스트 사이트에서는 그렇지 않습니다. 나는 이것을하기 위해 사용 된 세션이 존재하는지 아닌지를 살펴 보았다. 문제는 내가 믿는 타이밍이다. 내가 만든 앱 변수는 항상 목록의 마지막 항목으로 끝나며 따라서 항상 체크 박스가 비활성화되지 않도록합니다.

제 질문은이 타이밍 문제를 해결하고 더 효율적으로 만들 수있는 방법이 있습니까?

답변

0

나는이 문제를 오래 전에 알아 냈습니다. 문제는 itemName입니다. 루프가 어디에 있었는지 관계없이 항상 동일한 값으로 되돌아 왔습니다. 일단 그것을 colName으로 변경하면 갑자기 작업하기 시작합니다.

관련 문제