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