Html 布尔类型输入的MVC视图代码

Html 布尔类型输入的MVC视图代码,html,asp.net-mvc,model-view-controller,Html,Asp.net Mvc,Model View Controller,在我的第一个MVC项目中,我在“创建”视图中遇到了以下代码部分 这将在“创建”视图上为我显示一个下拉列表,其中包含以下值:未设置;是的;虚假的 是否有一种方法可以在我的bool的dropdownlist中更改这些值,以便它对用户说一些更可读/更容易理解的内容,例如:是;没有 我试图寻找解决方案,我认为这与以下几行有关: @Html.EditorFor(model => model.Attend) 正如@Stephen Muecke所说,您可以创建自己的选择列表。您可以使用自己的编辑器模板

在我的第一个MVC项目中,我在“创建”视图中遇到了以下代码部分

这将在“创建”视图上为我显示一个下拉列表,其中包含以下值:未设置;是的;虚假的

是否有一种方法可以在我的bool的dropdownlist中更改这些值,以便它对用户说一些更可读/更容易理解的内容,例如:是;没有

我试图寻找解决方案,我认为这与以下几行有关:

@Html.EditorFor(model => model.Attend)

正如@Stephen Muecke所说,您可以创建自己的选择列表。您可以使用自己的编辑器模板进行编辑

我是这样做的:

在视图/共享中创建
editoreplates
文件夹

使用以下代码在此文件夹中创建
YesNotSelected.cshtml

@model bool?

@Html.DropDownList("", new SelectListItem[] 
{ 
    new SelectListItem() 
    { 
        Text = "Not set", 
        Value = String.Empty, 
        Selected = !Model.HasValue
    }, 
    new SelectListItem() 
    { 
        Text = "True", 
        Value = "true", 
        Selected = Model.HasValue && Model.Value 
    }, 
    new SelectListItem() 
    { 
        Text = "False", 
        Value = "false", 
        Selected = Model.HasValue && !Model.Value 
    } 
})
在您的模型中,添加上述
参加
属性,如下所示:

[UIHint("YesNoNotSelected")]
public virtual bool? Attend { get; set; }

现在,
EditorFor
helper应该根据此模板呈现您的属性。

我喜欢世界上最好的场景:

  • 我不想总是需要暗示
  • 我根本不想使用UIHint,它不是描述性的
  • 我希望bools是可扩展的;是/否、对/错等
  • 下面是我如何实现它的:

    /Models/BooleanType.cs

    public enum BooleanDisplay
    {
      undefined = 0,
      YesNo = 1,
      TrueFalse = 2,
      GoodEvil = 3
    }
    
    [AttributeUsage(AttributeTargets.Property)]
    public class UIBooleanAttribute : UIHintAttribute
      :base("boolean", "MVC")
    {
      public UIBoolean(BooleanType displayAs)
      {
        DisplayAs = displayAs;
      }
    
      public BooleanDisplay DisplayAs { get; set; }
    }
    
    /MVC/UIBooleanType.cs

    public enum BooleanDisplay
    {
      undefined = 0,
      YesNo = 1,
      TrueFalse = 2,
      GoodEvil = 3
    }
    
    [AttributeUsage(AttributeTargets.Property)]
    public class UIBooleanAttribute : UIHintAttribute
      :base("boolean", "MVC")
    {
      public UIBoolean(BooleanType displayAs)
      {
        DisplayAs = displayAs;
      }
    
      public BooleanDisplay DisplayAs { get; set; }
    }
    
    /Views/Shared/EditorTemplates/boolean.cshtml

    @model boolean?
    
    @{
      // default
      var displayAs = BooleanDisplay.TrueFalse;
    
      var uiBoolean = ViewData
        .ModelMetadata
        .ContainerType
        .GetProperty(ViewData.ModelMetadata.PropertyName)
        .GetCustomAttributes(typeof(UIBooleanAttribute))
        .Select(ca => ca as UIBooleanAttribute)
        .FirstOrDefault(ca => ca != null);
    
      if (uiBoolean != null)
      {
        displayAs = uiBoolean.DisplayAs;
      }
    
      var values = new List<SelectListItem>()
      { 
        new SelectListItem() 
        { 
          Text = "Not set", 
          Value = String.Empty, 
          Selected = !Model.HasValue
        }
      };
    
      switch(displayAs)
      {
        default:
          throw new NotImplementedException(displayAs.ToString() 
            + " is not implemented in boolean.cshtml";
        YesNo:
          values.Add(new SelectListItem() 
          { 
            Text = "Yes", 
            Value = "true", 
            Selected = Model.HasValue && Model.Value 
          });
          values.Add(new SelectListItem() 
          { 
            Text = "No", 
            Value = "false", 
            Selected = Model.HasValue && !Model.Value 
          });
        TrueFalse: 
          // etc
      }
    }
    
    @Html.DropDownList("", values)
    
    视图:


    您可以创建自己的
    IEnumerable
    Value=“true”,Text=“Yes”
    等)并使用
    @Html.DropDownListFor()
    Stephen说的是创建您自己的选项列表,而不是新的帮助程序,这里您拥有的是一个编辑器模板,而不是帮助程序。帮助程序是对
    HtmlHelper
    的扩展。另外,FWIW,如果你想以相同的方式处理所有布尔值,你可以简单地命名你的编辑器模板
    Boolean.cshtml
    ,然后就不需要
    UIHint
    @ChrisPratt了。我想他不想以相同的方式处理所有可为空的布尔值,我同意这不是助手,而是编辑器模板,我知道。我的评论主要是针对OP的,这样他就不会因为想要编辑器模板而在应用程序的每个bool中添加
    UIHint
    。我不确定,这种方法真的比我的好吗?我以为@ChrisPratt是在说用
    bool?
    编辑下拉列表,这看起来不太好…我确实替换了编辑器模板,UIBoolean不是必需的,没有任何地方可以确定类型,例如
    UIHint(“MagicString”)
    ,所有布尔逻辑都封装在一个视图中。它不是更好,只是更高级。但是,我的意思是,你知道1个魔术字符串vs x3代码行,在视图中使用
    ModelMetadata
    ,但在helper方法中不使用。helper方法很好,但没有其他方法可以覆盖默认的布尔值。可以使用帮助器方法,如
    Html.DisplayBooleanFor()
    ,但它变成了,而这不是编辑器模板的惯例。ModelMetadata是专门为向模型、水印等添加元数据而设计的,我完全按照预期使用它(以及MVC如何在内部使用它)。
    public class Person
    {
      // defaults to True/False
      public bool AreYouHappy { get; set; }
    
      [UIBoolean(BooleanDisplay.GoodEvil)]
      public bool IsInherently { get; set; }
    }
    
    @model Person
    
    @Html.EditorFor(p => p.AreYouHappy)
    
    @Html.EditorFor(p => p.IsInherently)