使用Razor,我如何制作所有“bool?”属性在详细信息页面上显示为是/否/未设置?

时间:2011-04-25 21:28:56

标签: asp.net-mvc templates asp.net-mvc-3 razor

到目前为止,这是我的页面代码:

@model TennisClub.Models.ClubMember
@{
    ViewBag.Title = "Details";
}
<h2>
    Details
</h2>
<fieldset>
    <legend>ClubMember</legend>
    @Html.DisplayForModel()
</fieldset>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.Id }) |
    @Html.ActionLink("Back to List", "Index")
</p>

对于我模型中的所有可空bool(bool?),这会显示一个带有Not Set,True或False的灰色选择列表。我希望它只是纯文本:未设置,是或否。

我怎样才能最轻松地实现这一目标?我希望这种风格在我的网站上是全球性的。

修改

根据Mark的回答,我只是试着制作一个模板,但细节页看起来完全一样。

我创建了一个bool.cshtml文件并将其放在以下文件夹中:

  

[ProjectFolder] /查看/共享/ DisplayTemplates

这是我目前对 bool.cshtml 模板所拥有的内容:

@model bool?

@if (Model == null)
{
    <text>Not Set</text>
}
else
{
    if (Model.Value)
    {
        <text>Yes</text>
    }
    else
    {
        <text>No</text>
    }
}

这似乎对我的详细信息页面没有任何影响。

知道我做错了吗?

修改2

这是我的模特课:

public class ClubMember
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneType { get; set; }
    public bool? CanPlayDays { get; set; }
    public bool? CanPlayEvenings { get; set; }
    public bool? CanPlayWeekends { get; set; }
    public string Role { get; set; }
}

2 个答案:

答案 0 :(得分:11)

您可能希望覆盖默认模板。简而言之,在views文件夹下,您将创建一个“DisplayTemplates”文件夹和一个“EditorTemplates”文件夹。完成此操作后,您可以在模型为Boolean.cshtml的每个文件中创建一个bool?文件。然后,就显示选项而言,你可以做任何你想做的事情。这将更改所有bool?模型字段的呈现方式。

以下是我多次提到过的一篇博文,以帮助我解决这个问题。 http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

更新:提醒一句,请记住处理null案件。我过去忘记这样做了,它已经咬了我。

答案 1 :(得分:6)

模板文件是实现网站范围实施的方法。但我会用扩展方法更进一步。

public static string ToString(this bool? b, string ifTrue, string ifFalse, string ifNull)
{
   if(!b.HasValue) return ifNull;
   return b.Value ? ifTrue : ifFalse;
}
Boolean.ToString("Yes","No","Not Set");

这样可以更轻松地显示任意值。