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

dev*_*xer 11 asp.net-mvc templates razor asp.net-mvc-3

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

@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>
Run Code Online (Sandbox Code Playgroud)

对于bool?我的模型中的所有可空的bools(),这将显示一个带有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>
    }
}
Run Code Online (Sandbox Code Playgroud)

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

知道我做错了什么吗?

编辑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; }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_* S. 12

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

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

更新:一句谨慎,记得处理null此案.我过去忘记这样做,它咬了我.


Ton*_*llo 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");
Run Code Online (Sandbox Code Playgroud)

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