C# 使用编辑器模板处理可为空的类型

C# 使用编辑器模板处理可为空的类型,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我开发了一个编辑器模板,它采用布尔类型并创建一个下拉列表,将true和false默认值更改为Si和No。现在,当我部署应用程序时,我没有意识到boolean和Nullable与我的编辑器模板(boolean.cshtml)的名称是一样的,并受到影响。现在我不想这样,我想修改编辑器for的行为,仅当模型的数据类型为可空时,而不是当它是布尔值时。我怎么处理这个 @model Nullable<bool> @{ var listItems = new[] {

我开发了一个编辑器模板,它采用布尔类型并创建一个下拉列表,将
true
false
默认值更改为
Si
No
。现在,当我部署应用程序时,我没有意识到
boolean
Nullable
与我的编辑器模板(boolean.cshtml)的名称是一样的,并受到影响。现在我不想这样,我想修改
编辑器for
的行为,仅当模型的数据类型为
可空时,而不是当它是布尔值时。我怎么处理这个

 @model Nullable<bool>

@{
    var listItems = new[]
    {
        new SelectListItem { Value = "true", Text = "Si" },
        new SelectListItem { Value = "false", Text = "No" }
    };  

}


@Html.DropDownListFor( model => model.Value, listItems)
@模型可为空
@{
var listItems=new[]
{
新建SelectListItem{Value=“true”,Text=“Si”},
新建SelectListItem{Value=“false”,Text=“No”}
};  
}
@Html.DropDownListFor(model=>model.Value,listItems)

您无法阻止它们使用相同的编辑器模板。但是您可以在编辑器模板中处理它。你有:

ViewData.ModelMetadata.IsNullableValueType
如果您阅读本文,您实际上可以看到默认模板是如何使用它在两个不同的渲染之间切换的。从中偷取:


我的视图/Shared/EditorTemplates/Boolean.cshtml双向运行,处理可空复选框和常规复选框

@model bool?
@{
    if (ViewData.ModelMetadata.IsNullableValueType)
    {
        <text><div class="RB"></text>
        Dictionary<string, object> yesAttrs = new Dictionary<string, object>();
        Dictionary<string, object> noAttrs = new Dictionary<string, object>();
        Dictionary<string, object> nullAttrs = new Dictionary<string, object>();

        yesAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes");
        noAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No");
        nullAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA");


        if (Model.HasValue && Model.Value)
        {
            yesAttrs.Add("checked", "checked");
        }
        else if (Model.HasValue && !Model.Value)
        {
            noAttrs.Add("checked", "checked");
        }
        else
        {
            nullAttrs.Add("checked", "checked");
        }

        @Html.RadioButtonFor(x => x, "true", yesAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
        @Html.RadioButtonFor(x => x, "false", noAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
        @Html.RadioButtonFor(x => x, "", nullAttrs)
        <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA" class="nostrong" title="Unknown or To Be Determined">tbd</label>
        @:</div>
    }
    else
    {
        ModelState state = ViewData.ModelState[ViewData.ModelMetadata.PropertyName];
        bool value = Model ?? false;
        if (state != null && state.Errors.Count > 0)
        {
            <div class="input-validation-error" style="float: left"></div>
        }
        else
        {
            @Html.CheckBox("", value)
        }
    }
}
@modelbool?
@{
if(ViewData.ModelMetadata.IsNullableValueType)
{
Dictionary yesAttrs=新字典();
字典noAttrs=新字典();
Dictionary nullAttrs=新字典();
yesAttrs.Add(“id”,ViewData.TemplateInfo.getFullHtmlFieldDid(“是”);
noAttrs.Add(“id”,ViewData.TemplateInfo.getFullHtmlFieldDid(“”+“否”);
nullAttrs.Add(“id”,ViewData.TemplateInfo.getFullHtmlFieldDid(“”+“NA”);
if(Model.HasValue&&Model.Value)
{
添加(“已检查”、“已检查”);
}
else if(Model.HasValue&&!Model.Value)
{
添加(“已检查”、“已检查”);
}
其他的
{
添加(“已检查”、“已检查”);
}
@RadioButton(x=>x,“true”,yesAttrs)
对
@RadioButton(x=>x,“false”,noAttrs)
不
@RadioButton(x=>x,“,nullAttrs)
待定
@:
}
其他的
{
ModelState=ViewData.ModelState[ViewData.ModelMetadata.PropertyName];
布尔值=模型??错误;
如果(state!=null&&state.Errors.Count>0)
{
}
其他的
{
@复选框(“,值)
}
}
}
只有2-3个选定项目的下拉列表不考虑用户;他们需要两次点击,而单选按钮只需要一次点击(除非你没有房地产)


当您的客户/用户尚未做出决定,不想做出决定,也不认为您知道答案与您的业务有关,或者需要取消设置
true/1/on/positive
false/0/off/negative
,因为两者都不准确,
null
的第三个选项可以表示待确定(tbd),而不是设置,未知或不适用(n/a)。

您可以使用模型中的
TemplateHint
属性或将第二个参数显式设置为
@Html.EditorFor(m=>m.value,“TemplateName”)
,有关详细信息,请参阅Brad Wilson博客。