4

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

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

我目前在我的视图模型中

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

在我看来

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

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

电话: 02890777654

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

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

4

4 回答 4

5

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

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

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

 @if (Model.FomattedTelephone != null)
    {
       <div class="telephone">
          @Html.DisplayFor(model => model.FormattedTelephone)</div>
    }
于 2012-09-25T19:14:57.543 回答
1

对于样式,您可以在字段名称周围添加一个类。

您可以创建自己的 HtmlHelper,它只会在字符串不为空或不为空时写入。

或者您可以在此处添加类似的 DisplayTemplates: 如何为 DisplayFor() 创建 MVC Razor 模板

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

如果它们在您的 App_Code 文件夹中,请阅读 从 Razor 声明性视图中使用 MVC HtmlHelper 扩展的答案 您可能希望使用此方法覆盖默认帮助器页面(并在 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; }
        }
    }
于 2012-09-25T16:12:16.583 回答
1

我会为此做一个助手,如下所示:

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,如果不是,它将返回一个空字符串。

于 2012-09-25T19:31:53.233 回答
1

我通常更喜欢使用显示/编辑器模板而不是 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") 
于 2015-08-18T08:29:34.407 回答