如何根据角色使网站可编辑而非只读。

时间:2013-02-13 11:32:34

标签: asp.net-mvc-3 authorization readonly roleprovider

我有一个包含许多大视图的项目(可编辑的表单;考虑各种调查)。在试用阶段,客户想要一个可以查看所有表单和元素但不应该编辑/保存的角色。

一个简单的修复可能是检查角色并切换提交按钮的开/关。但是我希望有一些非常简单的方法可以将视图从editable转换为readonly,而无需在每个元素上输入HTML的@readonly(有超过一千个元素,从TextBoxFor,EditorFor到Checkbox和textareas)。

该项目使用三个角色:管理员,中心和患者。在有问题的控制器中,我有[授权(角色=“管理员,中心”)],但这可能需要现在(或者我需要添加患者),因为后者需要完整的readOnly访问。

有关如何使其工作的任何想法,而不编辑每个模型属性和/或每个剃刀编辑器?

Project使用mvc3,razor,jquery和jQuery-ui

1 个答案:

答案 0 :(得分:0)

为了结束这个老问题,我将介绍我解决它的方式。

我不得不重载" TextBoxFor"," CheckBoxFor" (等),将readOnly / disabled的布尔参数添加到方法的末尾。例如:

    //Overload TextBoxFor with a "disabled" parameter. For use with readonly-roles
    public static IHtmlString TextBoxForRo<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
    {
        var attributes = new RouteValueDictionary();

        if (htmlAttributes != null)
        {
            foreach (System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(htmlAttributes))
            {
                attributes.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
            }
        }

        if (disabled)
        {
            attributes["disabled"] = "disabled";
        }
        return htmlHelper.TextBoxFor(expression, attributes);
    }  

我必须为每种类型或表单输入执行此操作,显然我必须在视图中替换大量调用。它虽然有效,但它是我能想到的最好的解决方案。