我正在寻找设置我的控件可见,具体取决于数据库列可见性选项设置为true或false。我想动态设置控件可见性。我想使用CustomAttributes并使用它设置ViewModel。但我不知道如何。某人的出发点,帮助我开始。
[Visible]
public string FullName { get; set; }
答案 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)