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

How to set controls visibility dynamically in MVC depending on database records

我正在寻找根据设置为 true 或 false 的数据库列可见性选项将我的控件设置为可见。我想动态设置控件的可见性。我考虑使用 CustomAttributes 并用它设置 ViewModel。但我不知道如何。来自某人的起点并帮助我开始。

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

您可以像这样使用 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)

您必须执行以下步骤:

第 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)

我的比ali的回答稍微简单一点:

在您的模型中 class:

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)