【问题标题】:.net mvc Display field in view only if it has a value.net mvc 仅在具有值时才在视图中显示字段
【发布时间】:2012-09-25 16:09:52
【问题描述】:

我有一些客户详细信息,我只想显示具有值的字段。

例如,如果 Telephone 为 null,则不显示它。

我目前在我的视图模型中

    public string FormattedTelephone
    {
        get { return string.IsNullOrEmpty(this.Telephone) ? " " : this.Telephone; }
    }

在我看来

@Html.DisplayFor(model => model.FormattedTelephone)

这工作正常,但是,如果字段有值,我想显示字段名称,例如

电话: 02890777654

如果我在视图中使用@Html.DisplayNameFor,即使该字段为空,它也会显示字段名称。

我还想用粗体设置字段名称的样式,但不确定我在哪里设置样式 - 视图或视图模型。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    对于粗体样式,您可以在视图中使用这段代码,但使用外部样式表当然是合适的。

    <style type="text/css">
    .telephone{
    font-weight: bold;
    }
    </style>
    

    您可以在视图中检查 null 并有条件地显示数据:

     @if (Model.FomattedTelephone != null)
        {
           <div class="telephone">
              @Html.DisplayFor(model => model.FormattedTelephone)</div>
        }
    

    【讨论】:

    • 请解释为什么您的代码对提问者有帮助;仅仅粘贴一段代码并不能帮助很多人。
    • 希望保持视图干净,并检查视图模型。
    【解决方案2】:

    为样式添加一个类到您可以放在字段名称周围的跨度。

    您可以创建自己的 HtmlHelper,仅当字符串不为 null 或为空时才会写入。

    或者您可以在此处添加 DisplayTemplates: How do I create a MVC Razor template for DisplayFor()

    有关 razor 助手的更多背景信息,请阅读以下内容 http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

    如果它们在您的 App_Code 文件夹中,请阅读此问题的答案 Using MVC HtmlHelper extensions from Razor declarative views 你可能想用这个覆盖默认的帮助页面(并在 App_Code 中继承你的帮助类)

    public class WorkaroundHelperPage : HelperPage
        {
            // Workaround - exposes the MVC HtmlHelper instead of the normal helper
            public static new HtmlHelper Html
            {
                get { return ((WebViewPage)WebPageContext.Current.Page).Html; }
            }
    
            public static UrlHelper Url
            {
                get { return ((WebViewPage) WebPageContext.Current.Page).Url; }
            }
        }
    

    【讨论】:

    • 我认为 HtmlHelper 是要走的路,只是不知道从哪里开始。
    • @Stephen 到目前为止你尝试过什么。假设您有一个静态助手并尝试将其插入页面,您可以在问题中显示您的代码吗?
    • 我目前正在测试@naspinski 代码,但出现错误。
    • @Stephen 这是声明式视图吗?
    • 改了,我想你用的是不同的版本?
    【解决方案3】:

    我会为此做一个助手,像这样:

    using System.Web.Mvc.Html;
    public static class HtmlHelpers
    {
        public static MvcHtmlString LabelDisplayFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
        {
            StringBuilder html = new StringBuilder();
            string disp = helper.DisplayFor(expression).ToString();
            if (!string.IsNullOrWhiteSpace(disp))
            {
                html.AppendLine(helper.DisplayNameFor(expression).ToString());
                html.AppendLine(disp);
            }
            return MvcHtmlString.Create(html.ToString());
        }
    }
    

    现在,当您在视图中时,您可以简单地执行此操作(假设您在视图或 web.config 中包含命名空间):

    @Html.LabelDisplayFor(model => model.FormattedTelephone)
    

    它真正做的就是检查你的显示助手是否不是一个空字符串,如果是,它会简单地附加你的 LabelFor 和 DisplayFor,如果不是,它会返回一个空字符串。

    【讨论】:

    • 我在 DisplayFor 和 LabelFor 上遇到错误 'System.Web.Mvc.HtmlHelper' 不包含 'LabelFor' 的定义并且没有扩展方法 'LabelFor' 接受第一个参数键入'System.Web.Mvc.HtmlHelper'
    • 奇怪,您必须使用不同的版本?看起来您正在使用“DisplayNameFor”(已编辑)
    • 更新了将 LabelDisplayFor 和 DisplayFor 更改为 DisplayNameFor 的代码,现在没有错误。将对其进行测试。
    • 出现编译错误 CS0121:以下方法或属性之间的调用不明确:MyProject.Helpers.HtmlHelpers.DisplayNameFor 和 System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor
    • 您必须将方法名称更改为 DisplayNameFor 以外的名称
    【解决方案4】:

    我通常更喜欢使用显示/编辑器模板而不是 HtmlHelper。这是我用来执行完全相同任务的模板,它是为引导数据列表设计的,但任何人都可以轻松调整它。

    @if (Model == null)
    {
        @ViewData.ModelMetadata.NullDisplayText
    }
    else if (ViewData.TemplateInfo.TemplateDepth > 1)
    {
        @ViewData.ModelMetadata.SimpleDisplayText
    }
    else
    {
        <dl class="dl-horizontal">
            @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm)))
            {
                if(MvcHtmlString.IsNullOrEmpty(Html.Display(prop.PropertyName)))
                {
                    continue;
                }    
    
                if (prop.HideSurroundingHtml)
                {
                    @Html.Display(prop.PropertyName)
                }
                else
                {
                    <dt>@prop.GetDisplayName()</dt>
                    <dd>@Html.Display(prop.PropertyName)</dd>
                }
            }
        </dl>
    } 
    

    关键行是:

    if(MvcHtmlString.IsNullOrEmpty(Html.Display(prop.PropertyName)))
    

    它基于对象模板,所以要使用它,你需要在对象或整个模型上使用它

    @Html.DisplayForModel("TemplateName") 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-01
      • 2017-10-26
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多