如何根据数据库记录在 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)
我正在寻找根据设置为 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)