如何根据数据库记录在MVC中动态设置控件可见性

时间:2016-07-21 00:29:31

标签: c# asp.net asp.net-mvc viewmodel custom-attributes

我正在寻找设置我的控件可见,具体取决于数据库列可见性选项设置为true或false。我想动态设置控件可见性。我想使用CustomAttributes并使用它设置ViewModel。但我不知道如何。某人的出发点,帮助我开始。

[Visible]
public string FullName { get; set; }

3 个答案:

答案 0 :(得分:1)

我的回答比阿里的答案稍微简单一些:

在您的Model类中:

public class Client
{
    [Visible]
    public string FullName { get; set; }
}

添加扩展方法VisibleLabelFor

public static class HtmlExtensions
{
    public static MvcHtmlString VisibleLabelFor<TModel, TResult>(this HtmlHelper<TModel> html, Expression<Func<TModel, TResult>> expression)
    {
        var type = expression.Body.NodeType;

        if (type == ExpressionType.MemberAccess)
        {
            var memberExpression = (MemberExpression) expression.Body;
            var p = memberExpression.Member as PropertyInfo;

            if (!Attribute.IsDefined(p, typeof (VisibleAttribute)))
                return new MvcHtmlString(string.Empty);

            return html.LabelFor(expression);
        }
    }
}

然后在你看来:

@Html.VisibleLabelFor(m => m.FullName)

答案 1 :(得分:0)

你可以用Razor写一个简单的@helper

App_Code\MyHelpers.cshtml

@helper DisplayIt(object value, bool visibility)
{
    if (!visibility){return;}

    <span>@value</span>
}

然后在你的视图中使用它:

@MyHelpers.DisplayIt(@Model.FullName, @Model.Visible)
@MyHelpers.DisplayIt(@Model.Email, @Model.Visible)
@MyHelpers.DisplayIt(@Model.Tel, @Model.Visible)

答案 2 :(得分:0)

您必须执行以下步骤:

第1步:创建自定义属性

public class VisibilityAttribute : ValidationAttribute
{
    private bool _isVisible;

    public VisibilityAttribute(bool visible = true)
    {
        _isVisible = visible;
    }

    public bool Status
    {
        get
        {
            return _isVisible;
        }
        set
        {
            _isVisible = value;
        }
    }
}

第2步:向模型添加自定义属性

[Visibility(Status = false)]
public string FullName { get; set; }

第3步:创建自定义Html助手

public static class CustomHtmlExtensions
{
    public static MvcHtmlString CustomDisplayFor<TModel, TResult>(this HtmlHelper<TModel> html,
        Expression<Func<TModel, TResult>> expression)
    {
        ExpressionType type = expression.Body.NodeType;
        if (type == ExpressionType.MemberAccess)
        {
            MemberExpression memberExpression = (MemberExpression)expression.Body;
            PropertyInfo pi = memberExpression.Member as PropertyInfo;

            var attributes = pi.GetCustomAttributes();

            foreach (var attribute in attributes)
            {

                if (attribute is VisibilityAttribute)
                {
                    VisibilityAttribute vi = attribute as VisibilityAttribute;
                    if (vi.Status)
                    {
                        var metadata = ModelMetadata.FromLambdaExpression<TModel, TResult>(expression, html.ViewData);
                        return MvcHtmlString.Create(metadata.SimpleDisplayText);
                    }
                }
            }
        }
        return MvcHtmlString.Create("");
    }
}

第4步:在视图中使用自定义Html助手

 @Html.CustomDisplayFor(model => model.FullName)