【问题标题】:MVC3 AD Role based authorization for JQGrid Edit linkJQGrid 编辑链接的 MVC3 AD 基于角色的授权
【发布时间】:2013-01-03 21:20:48
【问题描述】:

我对 JQgrid 和 mvc3 非常陌生。我有一个非常基本的带有编辑功能的 jQgrid。

我想在 JqGrid 加载时为某些用户(由 AD 验证)禁用 jqgrid.navgrid 中的编辑链接,并为具有不同角色的其他用户启用它。

我可以限制用户编辑网格数据,但这还不够。我希望用户甚至看不到 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(Roles=@"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);
                            }

        }

有人可以吗?帮助我实现这一目标。非常感激 !

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);
    }

【问题讨论】:

    标签: asp.net-mvc-3 jqgrid active-directory


    【解决方案1】:

    添加检查用户是否已通过身份验证,如果用户已通过身份验证,则将视图模型中的布尔值传递给您的视图,并根据此修改导航寻呼机。

    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: function()

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

    Edit-使用三元运算来简化代码。可能url: 属性也可以通过 userIsAuth 布尔值禁用。

    【讨论】:

    • 马克,谢谢你的评论。第一件事,我没有这样的 Jqgrid() ..我有一堆 param:value 里面..如果我像你提到的那样使用..它的很多鳕鱼重复..似乎不是很好的方法..甚至我不知道如何从我的控制器传递那个参数..我试图在我的 DynamicGridData mehtod 中放这样的东西:
    • 我在实际问题中添加了 DynamicGridData
    • 我不明白你没有这样的 jQgrid() 是什么意思?我在上面所做的只是定义了导航区域的构建,与您声明网格本身的位置分开。您可以使用三元运算符轻松地将上述代码简化为一条语句,但我想保持明确。如果您不知道如何将布尔值传递给视图,我想您可以通过 jQgrid 数据中的 Userdata 传递它。
    • 嗨,马克,我很抱歉,但似乎我做错了什么。我在网格加载时调用的方法中添加了 userdata:isAuth(动态网格数据)。我还添加了 loadComplete: function(){var isAuth = jQuery("#list").getGridParam('userData')} 。但我得到 isAuth is undefined 。我需要在其他地方定义 isAuth 参数吗?感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2013-02-13
    • 2015-01-02
    • 2022-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多