Как настроить видимость элементов управления динамически в MVC в зависимости от записей базы данных

Я ищу, чтобы мои элементы управления были видны в зависимости от того, для параметра видимости столбца базы данных установлено значение true или false. Я хотел бы настроить видимость элементов управления динамически. Я подумываю использовать CustomAttributes и установить с ним ViewModel. Но я не знаю как. Отправная точка от кого-то, и помогите мне начать.

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

person maxspan    schedule 21.07.2016    source источник
comment
Это может помочь вам начать работу. Как скрыть элемент div в зависимости от значения модели?   -  person Shyju    schedule 21.07.2016
comment
Я хочу использовать CustomAttribute, это решение практически не связано с пользовательским интерфейсом.   -  person maxspan    schedule 21.07.2016
comment
Что вы имеете в виду под CustomAttribute?   -  person Win    schedule 21.07.2016
comment
Я отредактировал свой вопрос   -  person maxspan    schedule 21.07.2016
comment
Что ж, если вы используете атрибут Data Annotation, вам также придется написать клиентские Html Helpers. Для простой задачи может потребоваться много работы; это зависит от вас. Как работают аннотации к данным?   -  person Win    schedule 21.07.2016


Ответы (3)


Мой немного проще, чем ответ Али:

В вашем классе модели:

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)
person Stephen Zeng    schedule 21.07.2016

Вы можете написать простой @helper с помощью Razor следующим образом:

In 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)
person RAM    schedule 21.07.2016

Вы должны выполнить следующие действия:

Шаг 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)
person Ali Soltani    schedule 21.07.2016